From 85214a1fffbb0303af0263603af1ec1ac31dd242 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 10 Mar 2024 14:37:52 +0000 Subject: [PATCH] Rebuild pages at 0724a6c34e527f34b661daece67b3b60bf34fd9f --- .../authorship.json | 2 +- AY2324S2-CS2103-F08-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F13-4_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T08-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T11-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T11-4_tp_master/commits.json | 2 +- AY2324S2-CS2103T-T14-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W08-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W09-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W10-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W10-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W13-1_tp_master/commits.json | 2 +- archive.zip | Bin 2360375 -> 2587009 bytes reposense-logs/reposense.log.0 | 2660 ++++++++--------- summary.json | 2 +- 24 files changed, 1352 insertions(+), 1352 deletions(-) diff --git a/AY2324S2-CS2103-F08-3_tp_master/authorship.json b/AY2324S2-CS2103-F08-3_tp_master/authorship.json index 94990ec2..364c4ea6 100644 --- a/AY2324S2-CS2103-F08-3_tp_master/authorship.json +++ b/AY2324S2-CS2103-F08-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Pluiexo"},"content":"# StaffConnect","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103-F08-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"This product allows users to easily identify and connect with educators by providing visual cues alongside contact","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Pluiexo"},"content":"details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Pluiexo"},"content":"# Features:","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Pluiexo"},"content":"* Quickly add and review contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Pluiexo"},"content":"* Filter and search your required contacts quickly","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Pluiexo"},"content":"* Add consultation times to the particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Pluiexo"},"content":"* View and manage your meeting times","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Pluiexo"},"content":"# Getting Started","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Pluiexo"},"content":" * Ensure that at least **Java 11 with JavaFx runtime is installed**","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Pluiexo"},"content":" * Run the the application with ```java -jar StaffConnect.jar```","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Pluiexo"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Pluiexo"},"content":"# Credits","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Pluiexo"},"content":"StaffConnect is an ongoing software project for a desktop application used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Pluiexo"},"content":"* For the detailed documentation of this project, see the **[StaffConnect Product Website](https://ay2324s2-cs2103-f08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Pluiexo"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Pluiexo"},"content":"* If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Pluiexo":22,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"### Lim Xiu Jia","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/tsulim.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"[[github](https://github.com/tsulim)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/tsulim.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"whitesnowx"},"content":"### Calista Wong","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"whitesnowx"},"content":"\u003cimg src\u003d\"images/whitesnowx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"whitesnowx"},"content":"[[github](https://github.com/whitesnowx)]","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/whitesnowx)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"whitesnowx"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"whitesnowx"},"content":"* Responsibilities: Documentation and organisation","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":"### Li Xinyi ","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":"\u003cimg src\u003d\"images/iynixil.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"[[github](http://github.com/iynixil)] [[portfolio](team/iynixil.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":"* Responsibilities: Documentation Quality Assurance","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"### Jerry Wang","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/jerrywang0000.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"[[github](http://github.com/JerryWang0000)]","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/jerrywang0000)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"JerryWang0000"},"content":"* Role: Backend Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"JerryWang0000"},"content":"* Responsibilities: Development of Functionalities","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"Pluiexo"},"content":"### Norton Ng","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"Pluiexo"},"content":"\u003cimg src\u003d\"images/pluiexo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Pluiexo"},"content":"[[github](http://github.com/Pluiexo)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"Pluiexo"},"content":"[[portfolio](team/pluiexo.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Pluiexo"},"content":"* Responsibilities: Development of UI/UX and Integration, Lead","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tsulim":9,"iynixil":4,"JerryWang0000":4,"Pluiexo":5,"whitesnowx":5,"-":32}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"iynixil"},"content":"* This developer guide is adapted from [AB-3 Developer Guide](https://se-education.org/addressbook-level3/DeveloperGuide.html).","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"iynixil"},"content":"Bob is a 22 year old NUS SOC student who often struggles with finding details about his professors\u0027 and tutors\u0027 consultation hours.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"iynixil"},"content":"He prefers certain professors and tutors but often misplaces their contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"iynixil"},"content":"as such information can be hard to find online. He also has difficulty identifying his professors and changing tutors.","lastModifiedDate":"2024-03-06"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"iynixil"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"iynixil"},"content":"StaffConnect offers convenience and efficiency for a forgetful tech-savvy student.","lastModifiedDate":"2024-03-06"},{"lineNumber":272,"author":{"gitId":"iynixil"},"content":"StaffConnect allows users to easily identify and connect with educators by providing visual cues alongside their contact details, supported by an easy-to-use filtering system.","lastModifiedDate":"2024-03-06"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"iynixil"},"content":"| `* * *` | sociable user | save a contact\u0027s name, email, phone number, title in one line | save time per entry |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s name | recall how to address the professor |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | store a professor\u0027s faculty | see the faculty that a professor belongs to |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"iynixil"},"content":"| `* * *` | student who get lost easily | view the locations of my meetings/classes | search the locations for my meetings easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s consultation hours | arrange times to meet my professor for consultation |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their name | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their availability | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store the modules a professor is teaching | contact the professors who teach a module which I am currently taking |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | filter the professors by their faculty or the course they teach | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"whitesnowx"},"content":"(For all use cases below, the **System** is the `StaffConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"whitesnowx"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"whitesnowx"},"content":"2. User requests to add a new person","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"whitesnowx"},"content":"**Use case: Filter the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"whitesnowx"},"content":"2. User requests to filter the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a filtered list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"whitesnowx"},"content":"**Use case: Sort the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"whitesnowx"},"content":"2. User requests to sort the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a sorted list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"whitesnowx"},"content":"**Use case: Delete a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"whitesnowx"},"content":"2. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook deletes the person","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"whitesnowx"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"whitesnowx"},"content":"2. User requests to edit a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook edits the person","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"JerryWang0000"},"content":"2. Should be able to answer a user\u0027s prompt within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"JerryWang0000"},"content":"3. Should require less computational resources to allow users with older hardware can use the app without trouble.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"JerryWang0000"},"content":"4. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"JerryWang0000"},"content":"5. Should be able to provide error messages when a user does not type in expected prompts.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"JerryWang0000"},"content":"6. Should be able to store the users\u0027 information securely without leakage.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"JerryWang0000"},"content":"7. Should provide understandable and informative responses whenever a user provides a prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"JerryWang0000"},"content":"8. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"JerryWang0000"},"content":"9. A user without much experience in admin commands should be able to handle the usage in rather short time.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"JerryWang0000"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS, with versions that support Java 11","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"JerryWang0000"},"content":"* **Users\u0027 Information**: Same as above","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"JerryWang0000"},"content":"* **Error Message**: A prompt printed to the user that the program execution cannot run normally and specifies the most possible cause","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"JerryWang0000"},"content":"* **MSS**: Main Success Scenario","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"iynixil":18,"JerryWang0000":12,"whitesnowx":76,"-":362}},{"path":"docs/Documentation.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Documentation guide","lastModifiedDate":"2020-06-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"**Setting up and maintaining the project website:**","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* We use [**Jekyll**](https://jekyllrb.com/) to manage documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* The `docs/` folder is used for documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* To learn how set it up and maintain the project website, follow the guide [_[se-edu/guides] **Using Jekyll for project documentation**_](https://se-education.org/guides/tutorials/jekyll.html).","lastModifiedDate":"2020-06-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* Note these points when adapting the documentation to a different project/product:","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * The \u0027Site-wide settings\u0027 section of the page linked above has information on how to update site-wide elements such as the top navigation bar.","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * :bulb: In addition to updating content files, you might have to update the config files `docs\\_config.yml` and `docs\\_sass\\minima\\_base.scss` (which contains a reference to `AB-3` that comes into play when converting documentation pages to PDF format).","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* If you are using Intellij for editing documentation files, you can consider enabling \u0027soft wrapping\u0027 for `*.md` files, as explained in [_[se-edu/guides] **Intellij IDEA: Useful settings**_](https://se-education.org/guides/tutorials/intellijUsefulSettings.html#enabling-soft-wrapping)","lastModifiedDate":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Also relevant is the [_[se-edu/guides] **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"**Diagrams:**","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* See the [_[se-edu/guides] **Using PlantUML**_](https://se-education.org/guides/tutorials/plantUml.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"**Converting a document to the PDF format:**","lastModifiedDate":"2020-06-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* See the guide [_[se-edu/guides] **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html)","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"whitesnowx":2,"-":29}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"StaffConnect (SC) is a **desktop app for managing contacts of Professors and Tutors, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, SC can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"Pluiexo"},"content":"1. Download the latest `StaffConnect.jar` from [here](https://github.com/AY2324S2-CS2103-F08-3/tp/).","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Pluiexo"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your StaffConnect application.","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Pluiexo"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar StaffConnect.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Pluiexo"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the contacts list.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"Pluiexo"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"Pluiexo"},"content":"Adds a person to the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"Pluiexo"},"content":"Shows a list of all persons in the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"Pluiexo"},"content":"Edits an existing person in the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"Pluiexo"},"content":"Deletes the specified person from the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"Pluiexo"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"Pluiexo"},"content":"Clears all entries from the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"Pluiexo"},"content":"StaffConnect data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":162,"author":{"gitId":"Pluiexo"},"content":"StaffConnect data are saved automatically as a JSON file `[JAR file location]/data/StaffConnect.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"Pluiexo"},"content":"If your changes to the data file makes its format invalid, StaffConnect will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"Pluiexo"},"content":"Furthermore, certain edits can cause the StaffConnect to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":169,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"Pluiexo"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous StaffConnect home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":184,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Pluiexo":17,"-":181}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"tsulim"},"content":" content: \"StaffConnect\";","lastModifiedDate":"2024-03-08"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"tsulim":1,"-":294}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103-F08-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Pluiexo"},"content":"[![codecov](https://codecov.io/gh/Pluiexo/tp/graph/badge.svg?token\u003d2UVL2OKOKL)](https://codecov.io/gh/Pluiexo/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"Pluiexo"},"content":"**StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues.**","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Pluiexo"},"content":"This product allows users to easily identify and connect with educators by providing visual cues alongside contact","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Pluiexo"},"content":"details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"Pluiexo"},"content":"* If you are interested in using StaffConnect, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Pluiexo"},"content":"* If you are interested about developing StaffConnect, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Pluiexo":8,"-":13}},{"path":"docs/team/iynixil.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"iynixil"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xin Yi\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"iynixil"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"iynixil"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"iynixil"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"iynixil"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"iynixil"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"iynixil"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"iynixil"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"iynixil"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"iynixil"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"iynixil"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"iynixil"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"iynixil"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"iynixil"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"iynixil"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"iynixil"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"iynixil"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"iynixil"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"iynixil"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"iynixil"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"iynixil"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"iynixil"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"iynixil"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"iynixil":43,"Pluiexo":3}},{"path":"docs/team/jerrywang0000.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"JerryWang0000"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"JerryWang0000"},"content":"title: Jerry Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"JerryWang0000"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"JerryWang0000"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"JerryWang0000"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"JerryWang0000"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"JerryWang0000"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"JerryWang0000"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"JerryWang0000"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"JerryWang0000"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"JerryWang0000"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"JerryWang0000"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"JerryWang0000"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"JerryWang0000"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"JerryWang0000"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"JerryWang0000"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"JerryWang0000"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"JerryWang0000"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"JerryWang0000"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"JerryWang0000"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"JerryWang0000"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"JerryWang0000"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"JerryWang0000"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"JerryWang0000"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"JerryWang0000"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"JerryWang0000"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"JerryWang0000":44,"Pluiexo":2}},{"path":"docs/team/pluiexo.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Norton\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Pluiexo":3,"-":43}},{"path":"docs/team/tsulim.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"tsulim"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xiu Jia\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"tsulim"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"tsulim"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"tsulim"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"tsulim"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"tsulim"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"tsulim"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"tsulim"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"tsulim"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"tsulim"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"tsulim":43,"Pluiexo":3}},{"path":"docs/team/whitesnowx.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"whitesnowx"},"content":"title: Wong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Pluiexo":2,"whitesnowx":1,"-":43}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Pluiexo"},"content":"# StaffConnect","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103-F08-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"This product allows users to easily identify and connect with educators by providing visual cues alongside contact","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Pluiexo"},"content":"details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Pluiexo"},"content":"# Features:","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Pluiexo"},"content":"* Quickly add and review contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Pluiexo"},"content":"* Filter and search your required contacts quickly","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Pluiexo"},"content":"* Add consultation times to the particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Pluiexo"},"content":"* View and manage your meeting times","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Pluiexo"},"content":"# Getting Started","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Pluiexo"},"content":" * Ensure that at least **Java 11 with JavaFx runtime is installed**","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Pluiexo"},"content":" * Run the the application with ```java -jar StaffConnect.jar```","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Pluiexo"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Pluiexo"},"content":"# Credits","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Pluiexo"},"content":"StaffConnect is an ongoing software project for a desktop application used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Pluiexo"},"content":"* For the detailed documentation of this project, see the **[StaffConnect Product Website](https://ay2324s2-cs2103-f08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Pluiexo"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Pluiexo"},"content":"* If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Pluiexo":22,"-":3}},{"path":"build.gradle","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"plugins {","lastModifiedDate":"2016-08-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":" id \u0027java\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":" id \u0027checkstyle\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" id \u0027com.github.johnrengelman.shadow\u0027 version \u00277.1.2\u0027","lastModifiedDate":"2022-06-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":" id \u0027application\u0027","lastModifiedDate":"2016-12-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":" id \u0027jacoco\u0027","lastModifiedDate":"2020-08-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"mainClassName \u003d \u0027staffconnect.Main\u0027","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"sourceCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"targetCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"repositories {","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" mavenCentral()","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" maven { url \u0027https://oss.sonatype.org/content/repositories/snapshots/\u0027 }","lastModifiedDate":"2018-04-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"checkstyle {","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" toolVersion \u003d \u002710.2\u0027","lastModifiedDate":"2022-04-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"test {","lastModifiedDate":"2018-03-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" useJUnitPlatform()","lastModifiedDate":"2018-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" finalizedBy jacocoTestReport","lastModifiedDate":"2020-08-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-08-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"task coverage(type: JacocoReport) {","lastModifiedDate":"2020-08-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":" sourceDirectories.from files(sourceSets.main.allSource.srcDirs)","lastModifiedDate":"2020-08-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" classDirectories.from files(sourceSets.main.output)","lastModifiedDate":"2020-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" executionData.from files(jacocoTestReport.executionData)","lastModifiedDate":"2020-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" afterEvaluate {","lastModifiedDate":"2020-08-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" classDirectories.from files(classDirectories.files.collect {","lastModifiedDate":"2020-08-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" fileTree(dir: it, exclude: [\u0027**/*.jar\u0027])","lastModifiedDate":"2020-08-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" })","lastModifiedDate":"2020-08-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" reports {","lastModifiedDate":"2020-08-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" html.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":" xml.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"dependencies {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String jUnitVersion \u003d \u00275.4.0\u0027","lastModifiedDate":"2019-02-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String javaFxVersion \u003d \u002717.0.7\u0027","lastModifiedDate":"2023-07-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":50,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.core\u0027, name: \u0027jackson-databind\u0027, version: \u00272.7.0\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.datatype\u0027, name: \u0027jackson-datatype-jsr310\u0027, version: \u00272.7.4\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" testImplementation group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-api\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" testRuntimeOnly group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-engine\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"shadowJar {","lastModifiedDate":"2016-08-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":" archiveFileName \u003d \u0027addressbook.jar\u0027","lastModifiedDate":"2022-06-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"defaultTasks \u0027clean\u0027, \u0027test\u0027","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"tsulim":1,"-":71}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"### Lim Xiu Jia","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/tsulim.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"[[github](https://github.com/tsulim)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/tsulim.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"whitesnowx"},"content":"### Calista Wong","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"whitesnowx"},"content":"\u003cimg src\u003d\"images/whitesnowx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"whitesnowx"},"content":"[[github](https://github.com/whitesnowx)]","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/whitesnowx)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"whitesnowx"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"whitesnowx"},"content":"* Responsibilities: Documentation and organisation","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":"### Li Xinyi ","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":"\u003cimg src\u003d\"images/iynixil.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"[[github](http://github.com/iynixil)] [[portfolio](team/iynixil.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":"* Responsibilities: Documentation Quality Assurance","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"### Jerry Wang","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/jerrywang0000.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"[[github](http://github.com/JerryWang0000)]","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/jerrywang0000)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"JerryWang0000"},"content":"* Role: Backend Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"JerryWang0000"},"content":"* Responsibilities: Development of Functionalities","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"Pluiexo"},"content":"### Norton Ng","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"Pluiexo"},"content":"\u003cimg src\u003d\"images/pluiexo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Pluiexo"},"content":"[[github](http://github.com/Pluiexo)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"Pluiexo"},"content":"[[portfolio](team/pluiexo.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Pluiexo"},"content":"* Responsibilities: Development of UI/UX and Integration, Lead","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tsulim":9,"iynixil":4,"JerryWang0000":4,"Pluiexo":5,"whitesnowx":5,"-":32}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"iynixil"},"content":"* This developer guide is adapted from [AB-3 Developer Guide](https://se-education.org/addressbook-level3/DeveloperGuide.html).","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"tsulim"},"content":"Classes used by multiple components are in the `staffconnect.commons` package.","lastModifiedDate":"2024-03-10"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"iynixil"},"content":"Bob is a 22 year old NUS SOC student who often struggles with finding details about his professors\u0027 and tutors\u0027 consultation hours.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"iynixil"},"content":"He prefers certain professors and tutors but often misplaces their contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"iynixil"},"content":"as such information can be hard to find online. He also has difficulty identifying his professors and changing tutors.","lastModifiedDate":"2024-03-06"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"iynixil"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"iynixil"},"content":"StaffConnect offers convenience and efficiency for a forgetful tech-savvy student.","lastModifiedDate":"2024-03-06"},{"lineNumber":272,"author":{"gitId":"iynixil"},"content":"StaffConnect allows users to easily identify and connect with educators by providing visual cues alongside their contact details, supported by an easy-to-use filtering system.","lastModifiedDate":"2024-03-06"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"iynixil"},"content":"| `* * *` | sociable user | save a contact\u0027s name, email, phone number, title in one line | save time per entry |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s name | recall how to address the professor |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | store a professor\u0027s faculty | see the faculty that a professor belongs to |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"iynixil"},"content":"| `* * *` | student who get lost easily | view the locations of my meetings/classes | search the locations for my meetings easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s consultation hours | arrange times to meet my professor for consultation |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their name | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their availability | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store the modules a professor is teaching | contact the professors who teach a module which I am currently taking |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | filter the professors by their faculty or the course they teach | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"whitesnowx"},"content":"(For all use cases below, the **System** is the `StaffConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"whitesnowx"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"whitesnowx"},"content":"2. User requests to add a new person","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"whitesnowx"},"content":"**Use case: Filter the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"whitesnowx"},"content":"2. User requests to filter the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a filtered list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"whitesnowx"},"content":"**Use case: Sort the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"whitesnowx"},"content":"2. User requests to sort the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a sorted list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"whitesnowx"},"content":"**Use case: Delete a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"whitesnowx"},"content":"2. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook deletes the person","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"whitesnowx"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"whitesnowx"},"content":"2. User requests to edit a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook edits the person","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"JerryWang0000"},"content":"2. Should be able to answer a user\u0027s prompt within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"JerryWang0000"},"content":"3. Should require less computational resources to allow users with older hardware can use the app without trouble.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"JerryWang0000"},"content":"4. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"JerryWang0000"},"content":"5. Should be able to provide error messages when a user does not type in expected prompts.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"JerryWang0000"},"content":"6. Should be able to store the users\u0027 information securely without leakage.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"JerryWang0000"},"content":"7. Should provide understandable and informative responses whenever a user provides a prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"JerryWang0000"},"content":"8. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"JerryWang0000"},"content":"9. A user without much experience in admin commands should be able to handle the usage in rather short time.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"JerryWang0000"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS, with versions that support Java 11","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"JerryWang0000"},"content":"* **Users\u0027 Information**: Same as above","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"JerryWang0000"},"content":"* **Error Message**: A prompt printed to the user that the program execution cannot run normally and specifies the most possible cause","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"JerryWang0000"},"content":"* **MSS**: Main Success Scenario","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"tsulim":1,"iynixil":18,"JerryWang0000":12,"whitesnowx":76,"-":361}},{"path":"docs/Documentation.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Documentation guide","lastModifiedDate":"2020-06-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"**Setting up and maintaining the project website:**","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* We use [**Jekyll**](https://jekyllrb.com/) to manage documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* The `docs/` folder is used for documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* To learn how set it up and maintain the project website, follow the guide [_[se-edu/guides] **Using Jekyll for project documentation**_](https://se-education.org/guides/tutorials/jekyll.html).","lastModifiedDate":"2020-06-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* Note these points when adapting the documentation to a different project/product:","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * The \u0027Site-wide settings\u0027 section of the page linked above has information on how to update site-wide elements such as the top navigation bar.","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * :bulb: In addition to updating content files, you might have to update the config files `docs\\_config.yml` and `docs\\_sass\\minima\\_base.scss` (which contains a reference to `AB-3` that comes into play when converting documentation pages to PDF format).","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* If you are using Intellij for editing documentation files, you can consider enabling \u0027soft wrapping\u0027 for `*.md` files, as explained in [_[se-edu/guides] **Intellij IDEA: Useful settings**_](https://se-education.org/guides/tutorials/intellijUsefulSettings.html#enabling-soft-wrapping)","lastModifiedDate":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Also relevant is the [_[se-edu/guides] **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"**Diagrams:**","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* See the [_[se-edu/guides] **Using PlantUML**_](https://se-education.org/guides/tutorials/plantUml.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"**Converting a document to the PDF format:**","lastModifiedDate":"2020-06-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* See the guide [_[se-edu/guides] **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html)","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"whitesnowx":2,"-":29}},{"path":"docs/SettingUp.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Setting up and getting started","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Setting up the project in your computer","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2020-06-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"Follow the steps in the following guide precisely. Things will not work out if you deviate in some steps.","lastModifiedDate":"2020-06-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"First, **fork** this repo, and **clone** the fork into your computer.","lastModifiedDate":"2020-06-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"If you plan to use Intellij IDEA (highly recommended):","lastModifiedDate":"2020-06-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. **Configure the JDK**: Follow the guide [_[se-edu/guides] IDEA: Configuring the JDK_](https://se-education.org/guides/tutorials/intellijJdk.html) to to ensure Intellij is configured to use **JDK 11**.","lastModifiedDate":"2020-06-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.\u003cbr\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":" :exclamation: Note: Importing a Gradle project is slightly different from importing a normal Java project.","lastModifiedDate":"2020-06-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. **Verify the setup**:","lastModifiedDate":"2020-06-07"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":" 1. Run the `staffconnect.Main` and try a few commands.","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" 1. [Run the tests](Testing.md) to ensure they all pass.","lastModifiedDate":"2020-06-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"## Before writing code","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. **Configure the coding style**","lastModifiedDate":"2020-06-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" If using IDEA, follow the guide [_[se-edu/guides] IDEA: Configuring the code style_](https://se-education.org/guides/tutorials/intellijCodeStyle.html) to set up IDEA\u0027s coding style to match ours.","lastModifiedDate":"2020-09-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Optionally, you can follow the guide [_[se-edu/guides] Using Checkstyle_](https://se-education.org/guides/tutorials/checkstyle.html) to find how to use the CheckStyle within IDEA e.g., to report problems _as_ you write code.","lastModifiedDate":"2020-06-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"1. **Set up CI**","lastModifiedDate":"2020-06-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" This project comes with a GitHub Actions config files (in `.github/workflows` folder). When GitHub detects those files, it will run the CI for your project automatically at each push to the `master` branch or to any PR. No set up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"1. **Learn the design**","lastModifiedDate":"2020-06-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [AddressBook’s architecture](DeveloperGuide.md#architecture).","lastModifiedDate":"2020-06-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"1. **Do the tutorials**","lastModifiedDate":"2020-06-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" These tutorials will help you get acquainted with the codebase.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * [Tracing code](tutorials/TracingCode.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * [Adding a new command](tutorials/AddRemark.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * [Removing fields](tutorials/RemovingFields.md)","lastModifiedDate":"2021-08-01"}],"authorContributionMap":{"tsulim":1,"-":54}},{"path":"docs/Testing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Testing guide","lastModifiedDate":"2020-06-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Running tests","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"There are two ways to run tests.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"* **Method 1: Using IntelliJ JUnit test runner**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * To run all tests, right-click on the `src/test/java` folder and choose `Run \u0027All Tests\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * To run a subset of tests, you can right-click on a test package,","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" test class, or a test and choose `Run \u0027ABC\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* **Method 2: Using Gradle**","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Open a console and run the command `gradlew clean test` (Mac/Linux: `./gradlew clean test`)","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-secondary\"\u003e:link: **Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.","lastModifiedDate":"2020-06-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"## Types of tests","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"This project has three types of tests:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"1. *Unit tests* targeting the lowest level methods/classes.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":" e.g. `staffconnect.commons.StringUtilTest`","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. *Integration tests* that are checking the integration of multiple code units (those code units are assumed to be working).\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"tsulim"},"content":" e.g. `staffconnect.storage.StorageManagerTest`","lastModifiedDate":"2024-03-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":"1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"tsulim"},"content":" e.g. `staffconnect.logic.LogicManagerTest`","lastModifiedDate":"2024-03-10"}],"authorContributionMap":{"tsulim":3,"-":33}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"StaffConnect (SC) is a **desktop app for managing contacts of Professors and Tutors, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, SC can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"Pluiexo"},"content":"1. Download the latest `StaffConnect.jar` from [here](https://github.com/AY2324S2-CS2103-F08-3/tp/).","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Pluiexo"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your StaffConnect application.","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Pluiexo"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar StaffConnect.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Pluiexo"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the contacts list.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"Pluiexo"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"Pluiexo"},"content":"Adds a person to the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"Pluiexo"},"content":"Shows a list of all persons in the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"Pluiexo"},"content":"Edits an existing person in the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"Pluiexo"},"content":"Deletes the specified person from the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"Pluiexo"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"Pluiexo"},"content":"Clears all entries from the contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"Pluiexo"},"content":"StaffConnect data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":162,"author":{"gitId":"Pluiexo"},"content":"StaffConnect data are saved automatically as a JSON file `[JAR file location]/data/StaffConnect.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"Pluiexo"},"content":"If your changes to the data file makes its format invalid, StaffConnect will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"Pluiexo"},"content":"Furthermore, certain edits can cause the StaffConnect to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":169,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"Pluiexo"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous StaffConnect home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":184,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Pluiexo":17,"-":181}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"tsulim"},"content":" content: \"StaffConnect\";","lastModifiedDate":"2024-03-08"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"tsulim":1,"-":294}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103-F08-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Pluiexo"},"content":"[![codecov](https://codecov.io/gh/Pluiexo/tp/graph/badge.svg?token\u003d2UVL2OKOKL)](https://codecov.io/gh/Pluiexo/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"Pluiexo"},"content":"**StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues.**","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Pluiexo"},"content":"This product allows users to easily identify and connect with educators by providing visual cues alongside contact","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Pluiexo"},"content":"details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"Pluiexo"},"content":"* If you are interested in using StaffConnect, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Pluiexo"},"content":"* If you are interested about developing StaffConnect, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Pluiexo":8,"-":13}},{"path":"docs/team/iynixil.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"iynixil"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xin Yi\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"iynixil"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"iynixil"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"iynixil"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"iynixil"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"iynixil"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"iynixil"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"iynixil"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"iynixil"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"iynixil"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"iynixil"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"iynixil"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"iynixil"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"iynixil"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"iynixil"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"iynixil"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"iynixil"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"iynixil"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"iynixil"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"iynixil"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"iynixil"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"iynixil"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"iynixil"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"iynixil":43,"Pluiexo":3}},{"path":"docs/team/jerrywang0000.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"JerryWang0000"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"JerryWang0000"},"content":"title: Jerry Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"JerryWang0000"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"JerryWang0000"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"JerryWang0000"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"JerryWang0000"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"JerryWang0000"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"JerryWang0000"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"JerryWang0000"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"JerryWang0000"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"JerryWang0000"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"JerryWang0000"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"JerryWang0000"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"JerryWang0000"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"JerryWang0000"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"JerryWang0000"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"JerryWang0000"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"JerryWang0000"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"JerryWang0000"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"JerryWang0000"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"JerryWang0000"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"JerryWang0000"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"JerryWang0000"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"JerryWang0000"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"JerryWang0000"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"JerryWang0000"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"JerryWang0000":44,"Pluiexo":2}},{"path":"docs/team/pluiexo.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Norton\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Pluiexo":3,"-":43}},{"path":"docs/team/tsulim.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"tsulim"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xiu Jia\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"tsulim"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"tsulim"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"tsulim"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"tsulim"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"tsulim"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"tsulim"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"tsulim"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"tsulim"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"tsulim"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"tsulim":43,"Pluiexo":3}},{"path":"docs/team/whitesnowx.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"whitesnowx"},"content":"title: Wong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Pluiexo":2,"whitesnowx":1,"-":43}},{"path":"docs/tutorials/AddRemark.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-07-29"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Adding a command\"","lastModifiedDate":"2020-07-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"Let\u0027s walk you through the implementation of a new command — `remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"This command allows users of the AddressBook application to add optional remarks to people in their address book and edit it if required. The command should have the following format:","lastModifiedDate":"2020-07-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"`remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`)","lastModifiedDate":"2020-07-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":12,"author":{"gitId":"-"},"content":"We’ll assume that you have already set up the development environment as outlined in the Developer’s Guide.","lastModifiedDate":"2020-07-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## Create a new `remark` command","lastModifiedDate":"2020-07-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Looking in the `logic.command` package, you will notice that each existing command have their own class. All the commands inherit from the abstract class `Command` which means that they must override `execute()`. Each `Command` returns an instance of `CommandResult` upon success and `CommandResult#feedbackToUser` is printed to the `ResultDisplay`.","lastModifiedDate":"2020-07-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory.","lastModifiedDate":"2020-07-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"For now, let’s keep `RemarkCommand` as simple as possible and print some output. We accomplish that by returning a `CommandResult` with an accompanying message.","lastModifiedDate":"2020-07-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.address.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Changes the remark of an existing person in the address book.","lastModifiedDate":"2020-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"remark\";","lastModifiedDate":"2020-07-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2020-07-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return new CommandResult(\"Hello from remark\");","lastModifiedDate":"2020-07-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Hook `RemarkCommand` into the application","lastModifiedDate":"2020-07-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"Now that we have our `RemarkCommand` ready to be executed, we need to update `AddressBookParser#parseCommand()` to recognize the `remark` keyword. Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`.","lastModifiedDate":"2020-07-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee).","lastModifiedDate":"2022-01-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"### Run the application","lastModifiedDate":"2020-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"Run `Main#main` and try out your new `RemarkCommand`. If everything went well, you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"![Output displayed](../images/add-remark/RemarkHello.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"## Change `RemarkCommand` to throw an exception","lastModifiedDate":"2020-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"While we have successfully printed a message to `ResultDisplay`, the command does not do what it is supposed to do. Let’s change the command to throw a `CommandException` to accurately reflect that our command is still a work in progress.","lastModifiedDate":"2020-12-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":"![The relationship between RemarkCommand and Command](../images/add-remark/RemarkCommandClass.png)","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"Following the convention in other commands, we add relevant messages as constants and use them.","lastModifiedDate":"2020-07-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":64,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2021-08-01"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + \": Edits the remark of the person identified \"","lastModifiedDate":"2021-08-01"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + \"by the index number used in the last person listing. \"","lastModifiedDate":"2020-07-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" + \"Existing remark will be overwritten by the input.\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2020-07-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":" + \"r/ [REMARK]\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2020-07-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" + \"r/ Likes to swim.\";","lastModifiedDate":"2020-07-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_IMPLEMENTED_YET \u003d","lastModifiedDate":"2021-08-01"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \"Remark command not implemented yet\";","lastModifiedDate":"2021-08-01"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET);","lastModifiedDate":"2020-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":"## Enhancing `RemarkCommand`","lastModifiedDate":"2020-07-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` to parse input from the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Make the command accept parameters","lastModifiedDate":"2020-07-29"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":91,"author":{"gitId":"-"},"content":"We start by modifying the constructor of `RemarkCommand` to accept an `Index` and a `String`. While we are at it, let’s change the error message to echo the values. While this is not a replacement for tests, it is an obvious way to tell if our code is functioning as intended.","lastModifiedDate":"2020-07-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":94,"author":{"gitId":"tsulim"},"content":"import static staffconnect.util.commons.address.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-10"},{"lineNumber":95,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ARGUMENTS \u003d \"Index: %1$d, Remark: %2$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private final String remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":103,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit the remark","lastModifiedDate":"2020-07-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @param remark of the person to be updated to","lastModifiedDate":"2020-07-29"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public RemarkCommand(Index index, String remark) {","lastModifiedDate":"2020-07-29"},{"lineNumber":108,"author":{"gitId":"-"},"content":" requireAllNonNull(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":110,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2020-07-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":" this.remark \u003d remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new CommandException(","lastModifiedDate":"2021-08-01"},{"lineNumber":116,"author":{"gitId":"-"},"content":" String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark));","lastModifiedDate":"2021-08-01"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":119,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2020-07-29"},{"lineNumber":121,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2020-07-29"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2020-07-29"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2020-07-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" if (!(other instanceof RemarkCommand)) {","lastModifiedDate":"2020-07-29"},{"lineNumber":127,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2020-07-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":130,"author":{"gitId":"-"},"content":" RemarkCommand e \u003d (RemarkCommand) other;","lastModifiedDate":"2020-07-29"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return index.equals(e.index)","lastModifiedDate":"2020-07-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":" \u0026\u0026 remark.equals(e.remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":137,"author":{"gitId":"-"},"content":"Your code should look something like [this](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-a8e35af8f9c251525063fae36c9852922a7e7195763018eacec60f3a4d87c594) after you are done.","lastModifiedDate":"2022-01-02"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"### Parse user input","lastModifiedDate":"2020-07-29"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":141,"author":{"gitId":"-"},"content":"Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":143,"author":{"gitId":"tsulim"},"content":"Create a `RemarkCommandParser` class in the `staffconnect.logic.parser` package. The class must extend the `Parser` interface.","lastModifiedDate":"2024-03-10"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":145,"author":{"gitId":"-"},"content":"![The relationship between Parser and RemarkCommandParser](../images/add-remark/RemarkCommandParserClass.png)","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":147,"author":{"gitId":"-"},"content":"Thankfully, `ArgumentTokenizer#tokenize()` makes it trivial to parse user input. Let’s take a look at the JavaDoc provided for the function to understand what it does.","lastModifiedDate":"2020-07-29"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":149,"author":{"gitId":"-"},"content":"**`ArgumentTokenizer.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":151,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":152,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":153,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap}","lastModifiedDate":"2020-07-29"},{"lineNumber":154,"author":{"gitId":"-"},"content":" * object that maps prefixes to their respective argument values. Only the","lastModifiedDate":"2020-07-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":" * given prefixes will be recognized in the arguments string.","lastModifiedDate":"2020-07-29"},{"lineNumber":156,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-07-29"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form:","lastModifiedDate":"2020-07-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":" * {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2020-07-29"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2020-07-29"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their","lastModifiedDate":"2020-07-29"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * arguments","lastModifiedDate":"2020-07-29"},{"lineNumber":162,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":163,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":165,"author":{"gitId":"-"},"content":"We can tell `ArgumentTokenizer#tokenize()` to look out for our new prefix `r/` and it will return us an instance of `ArgumentMultimap`. Now let’s find out what we need to do in order to obtain the Index and String that we need. Let’s look through `ArgumentMultimap` :","lastModifiedDate":"2020-07-29"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":167,"author":{"gitId":"-"},"content":"**`ArgumentMultimap.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":169,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":170,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2020-07-29"},{"lineNumber":172,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":173,"author":{"gitId":"-"},"content":"public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2020-07-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2020-07-29"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() :","lastModifiedDate":"2020-07-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2020-07-29"},{"lineNumber":177,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":178,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":"This appears to be what we need to get a String of the remark. But what about the Index? Let\u0027s take a quick peek at existing `Command` that uses an index to see how it is done.","lastModifiedDate":"2020-07-29"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":182,"author":{"gitId":"-"},"content":"**`DeleteCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":184,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":185,"author":{"gitId":"-"},"content":"Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":186,"author":{"gitId":"-"},"content":"return new DeleteCommand(index);","lastModifiedDate":"2020-07-29"},{"lineNumber":187,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":189,"author":{"gitId":"-"},"content":"There appears to be another utility class that obtains an `Index` from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Now that we have the know-how to extract the data that we need from the user’s input, we can parse the user command and create a new instance of `RemarkCommand`, as given below.","lastModifiedDate":"2020-07-29"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"**`RemarkCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":195,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":196,"author":{"gitId":"-"},"content":"public RemarkCommand parse(String args) throws ParseException {","lastModifiedDate":"2020-07-29"},{"lineNumber":197,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":198,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(args,","lastModifiedDate":"2020-07-29"},{"lineNumber":199,"author":{"gitId":"-"},"content":" PREFIX_REMARK);","lastModifiedDate":"2020-07-29"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":202,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-07-29"},{"lineNumber":203,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2020-07-29"},{"lineNumber":204,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2020-07-29"},{"lineNumber":205,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2020-07-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":" RemarkCommand.MESSAGE_USAGE), ive);","lastModifiedDate":"2020-07-29"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":209,"author":{"gitId":"-"},"content":" String remark \u003d argMultimap.getValue(PREFIX_REMARK).orElse(\"\");","lastModifiedDate":"2020-07-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":211,"author":{"gitId":"-"},"content":" return new RemarkCommand(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":212,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":213,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":215,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":217,"author":{"gitId":"-"},"content":":information_source: Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`!","lastModifiedDate":"2020-07-29"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":219,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":221,"author":{"gitId":"-"},"content":"If you are stuck, check out the sample","lastModifiedDate":"2020-07-29"},{"lineNumber":222,"author":{"gitId":"-"},"content":"[here](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-8bf239e8e9529369b577701303ddd96af93178b4ed6735f91c2d8488b20c6b4a).","lastModifiedDate":"2022-01-02"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":224,"author":{"gitId":"-"},"content":"## Add `Remark` to the model","lastModifiedDate":"2020-07-29"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":226,"author":{"gitId":"-"},"content":"Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of person data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person’s name). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person.","lastModifiedDate":"2020-07-29"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":228,"author":{"gitId":"-"},"content":"### Add a new `Remark` class","lastModifiedDate":"2020-07-29"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":230,"author":{"gitId":"tsulim"},"content":"Create a new `Remark` in `staffconnect.model.person`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code.","lastModifiedDate":"2024-03-10"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":232,"author":{"gitId":"-"},"content":"A copy-paste and search-replace later, you should have something like [this](https://github.com/se-edu/addressbook-level3/commit/4516e099699baa9e2d51801bd26f016d812dedcc#diff-41bb13c581e280c686198251ad6cc337cd5e27032772f06ed9bf7f1440995ece). Note how `Remark` has no constrains and thus does not require input","lastModifiedDate":"2022-01-02"},{"lineNumber":233,"author":{"gitId":"-"},"content":"validation.","lastModifiedDate":"2020-07-29"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"### Make use of `Remark`","lastModifiedDate":"2020-07-29"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":237,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. These should be relatively simple changes.","lastModifiedDate":"2020-07-29"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":239,"author":{"gitId":"-"},"content":"## Add a placeholder element for remark to the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"Without getting too deep into `fxml`, let’s go on a 5 minute adventure to get some placeholder text to show up for each person.","lastModifiedDate":"2020-07-29"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":243,"author":{"gitId":"tsulim"},"content":"Simply add the following to [`staffconnect.ui.address.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688).","lastModifiedDate":"2024-03-10"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":245,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":247,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":248,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-07-29"},{"lineNumber":249,"author":{"gitId":"-"},"content":"private Label remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":250,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":253,"author":{"gitId":"-"},"content":"`@FXML` is an annotation that marks a private or protected field and makes it accessible to FXML. It might sound like Greek to you right now, don’t worry — we will get back to it later.","lastModifiedDate":"2020-07-29"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":255,"author":{"gitId":"-"},"content":"Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9).","lastModifiedDate":"2022-01-02"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":257,"author":{"gitId":"-"},"content":"**`PersonListCard.fxml`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":259,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-07-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"remark\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$remark\" /\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":261,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":263,"author":{"gitId":"-"},"content":"That’s it! Fire up the application again and you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":265,"author":{"gitId":"-"},"content":"![$remark shows up in each entry](../images/add-remark/$Remark.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":267,"author":{"gitId":"-"},"content":"## Modify `Person` to support a `Remark` field","lastModifiedDate":"2020-07-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"Since `PersonCard` displays data from a `Person`, we need to update `Person` to get our `Remark` displayed!","lastModifiedDate":"2020-07-29"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":271,"author":{"gitId":"-"},"content":"### Modify `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"We change the constructor of `Person` to take a `Remark`. We will also need to define new fields and accessors accordingly to store our new addition.","lastModifiedDate":"2020-07-29"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### Update other usages of `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Unfortunately, a change to `Person` will cause other commands to break, you will have to modify these commands to use the updated `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":279,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":281,"author":{"gitId":"-"},"content":":bulb: Use the `Find Usages` feature in IntelliJ IDEA on the `Person` class to find these commands.","lastModifiedDate":"2020-07-29"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":283,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":285,"author":{"gitId":"-"},"content":"Refer to [this commit](https://github.com/se-edu/addressbook-level3/commit/ce998c37e65b92d35c91d28c7822cd139c2c0a5c) and check that you have got everything in order!","lastModifiedDate":"2020-07-29"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":288,"author":{"gitId":"-"},"content":"## Updating Storage","lastModifiedDate":"2020-07-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":290,"author":{"gitId":"-"},"content":"AddressBook stores data by serializing `JsonAdaptedPerson` into `json` with the help of an external library — Jackson. Let’s update `JsonAdaptedPerson` to work with our new `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":"While the changes to code may be minimal, the test data will have to be updated as well.","lastModifiedDate":"2020-07-29"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":294,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":296,"author":{"gitId":"-"},"content":":exclamation: You must delete AddressBook’s storage file located at `/data/addressbook.json` before running it! Not doing so will cause AddressBook to default to an empty address book!","lastModifiedDate":"2020-07-29"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":298,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":300,"author":{"gitId":"-"},"content":"Check out [this commit](https://github.com/se-edu/addressbook-level3/commit/556cbd0e03ff224d7a68afba171ad2eb0ce56bbf)","lastModifiedDate":"2020-07-29"},{"lineNumber":301,"author":{"gitId":"-"},"content":"to see what the changes entail.","lastModifiedDate":"2020-07-29"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"## Finalizing the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"Now that we have finalized the `Person` class and its dependencies, we can now bind the `Remark` field to the UI.","lastModifiedDate":"2020-07-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/commit/5b98fee11b6b3f5749b6b943c4f3bd3aa049b692)","lastModifiedDate":"2020-07-29"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":309,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":311,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":312,"author":{"gitId":"-"},"content":"public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2020-07-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":314,"author":{"gitId":"-"},"content":" remark.setText(person.getRemark().value);","lastModifiedDate":"2020-07-29"},{"lineNumber":315,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":316,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":318,"author":{"gitId":"-"},"content":"![The remark label is bound properly!](../images/add-remark/RemarkBound.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":320,"author":{"gitId":"-"},"content":"## Putting everything together","lastModifiedDate":"2020-07-29"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":322,"author":{"gitId":"-"},"content":"After the previous step, we notice a peculiar regression — we went from displaying something to nothing at all. However, this is expected behavior as we are yet to update the `RemarkCommand` to make use of the code we\u0027ve been adding in the last few steps.","lastModifiedDate":"2020-07-29"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":324,"author":{"gitId":"-"},"content":"### Update `RemarkCommand` and `RemarkCommandParser`","lastModifiedDate":"2020-07-29"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":326,"author":{"gitId":"-"},"content":"In this last step, we modify `RemarkCommand#execute()` to change the `Remark` of a `Person`. Since all fields in a `Person` are immutable, we create a new instance of a `Person` with the values that we want and","lastModifiedDate":"2020-07-29"},{"lineNumber":327,"author":{"gitId":"-"},"content":"save it with `Model#setPerson()`.","lastModifiedDate":"2020-07-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ADD_REMARK_SUCCESS \u003d \"Added remark to Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_REMARK_SUCCESS \u003d \"Removed remark from Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":338,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2020-07-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2020-07-29"},{"lineNumber":341,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2020-07-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-07-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new Person(","lastModifiedDate":"2021-08-01"},{"lineNumber":346,"author":{"gitId":"-"},"content":" personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),","lastModifiedDate":"2021-08-01"},{"lineNumber":347,"author":{"gitId":"-"},"content":" personToEdit.getAddress(), remark, personToEdit.getTags());","lastModifiedDate":"2020-07-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-07-29"},{"lineNumber":350,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-07-29"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":" return new CommandResult(generateSuccessMessage(editedPerson));","lastModifiedDate":"2020-07-29"},{"lineNumber":353,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":355,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * Generates a command execution success message based on whether","lastModifiedDate":"2021-08-01"},{"lineNumber":357,"author":{"gitId":"-"},"content":" * the remark is added to or removed from","lastModifiedDate":"2021-08-01"},{"lineNumber":358,"author":{"gitId":"-"},"content":" * {@code personToEdit}.","lastModifiedDate":"2020-07-29"},{"lineNumber":359,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":360,"author":{"gitId":"-"},"content":" private String generateSuccessMessage(Person personToEdit) {","lastModifiedDate":"2020-07-29"},{"lineNumber":361,"author":{"gitId":"-"},"content":" String message \u003d !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;","lastModifiedDate":"2020-07-29"},{"lineNumber":362,"author":{"gitId":"-"},"content":" return String.format(message, personToEdit);","lastModifiedDate":"2020-07-29"},{"lineNumber":363,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":364,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":366,"author":{"gitId":"-"},"content":"![Congratulations!](../images/add-remark/RemarkComplete.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":368,"author":{"gitId":"-"},"content":"## Writing tests","lastModifiedDate":"2020-07-29"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":370,"author":{"gitId":"-"},"content":"Tests are crucial to ensuring that bugs don’t slip into the codebase unnoticed. This is especially true for large code bases where a change might lead to unintended behavior.","lastModifiedDate":"2020-07-29"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":372,"author":{"gitId":"-"},"content":"Let’s verify the correctness of our code by writing some tests!","lastModifiedDate":"2020-07-29"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":374,"author":{"gitId":"-"},"content":"Of course you can simply add the test cases manually, like you\u0027ve been doing all along this tutorial. The result would be like the test cases in [here](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01). Alternatively, you can get the help of IntelliJ to generate the skeletons of the test cases, as explained in the next section.","lastModifiedDate":"2022-01-02"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":376,"author":{"gitId":"-"},"content":"### Automatically generating tests","lastModifiedDate":"2020-07-29"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":378,"author":{"gitId":"-"},"content":"The goal is to write effective and efficient tests to ensure that `RemarkCommand#execute()` behaves as expected.","lastModifiedDate":"2020-07-29"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":380,"author":{"gitId":"-"},"content":"The convention for test names is `methodName_testScenario_expectedResult`. An example would be","lastModifiedDate":"2020-07-29"},{"lineNumber":381,"author":{"gitId":"-"},"content":"`execute_filteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":383,"author":{"gitId":"-"},"content":"Let’s create a test for `RemarkCommand#execute()` to test that adding a remark works. On `IntelliJ IDEA` you can bring up the context menu and choose to `Go To` \\\u003e `Test` or use the appropriate keyboard shortcut.","lastModifiedDate":"2020-07-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":385,"author":{"gitId":"-"},"content":"![Using the context menu to jump to tests](../images/add-remark/ContextMenu.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"Then, create a test for the `execute` method.","lastModifiedDate":"2020-07-29"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"![Creating a test for `execute`.](../images/add-remark/CreateTest.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"Following convention, let’s change the name of the generated method to `execute_addRemarkUnfilteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":393,"author":{"gitId":"-"},"content":"Let’s use the utility functions provided in `CommandTestUtil`. The functions ensure that commands produce the expected `CommandResult` and output the correct message. In this case, `CommandTestUtil#assertCommandSuccess` is the best fit as we are testing that a `RemarkCommand` will successfully add a `Remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"You should end up with a test that looks something like [this](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49).","lastModifiedDate":"2022-01-02"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":397,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-07-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":399,"author":{"gitId":"-"},"content":"This concludes the tutorial for adding a new `Command` to AddressBook.","lastModifiedDate":"2020-07-29"}],"authorContributionMap":{"tsulim":6,"-":393}},{"path":"docs/tutorials/RemovingFields.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Removing Fields\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003e Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003e — Antoine de Saint-Exupery","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"When working on an existing code base, you will most likely find that some features that are no longer necessary.","lastModifiedDate":"2021-08-01"},{"lineNumber":11,"author":{"gitId":"-"},"content":"This tutorial aims to give you some practice on such a code \u0027removal\u0027 activity by removing the `address` field from `Person` class.","lastModifiedDate":"2021-08-01"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-success\"\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"**If you have done the [Add `remark` command tutorial](AddRemark.html) already**, you should know where the code had to be updated to add the field `remark`. From that experience, you can deduce where the code needs to be changed to _remove_ that field too. The removing of the `address` field can be done similarly.","lastModifiedDate":"2021-08-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"However, if you have no such prior knowledge, removing a field can take a quite a bit of detective work. This tutorial takes you through that process. **At least have a read even if you don\u0027t actually do the steps yourself.**","lastModifiedDate":"2021-08-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"## Safely deleting `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"IntelliJ IDEA provides a refactoring tool that can identify *most* parts of a removal easily. Let’s try to use it as much as we can.","lastModifiedDate":"2021-08-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Assisted refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":"The `address` field in `Person` is actually an instance of the `staffconnect.model.person.model.address.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`\u0027s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \\\u003e `Safe Delete` through the menu.","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* :bulb: To make things simpler, you can unselect the options `Search in comments and strings` and `Search for text occurrences`","lastModifiedDate":"2021-08-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"![Usages detected](../images/remove/UnsafeDelete.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"Choose to `View Usages` and you should be presented with a list of `Safe Delete Conflicts`. These conflicts describe locations in which the `Address` class is used.","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"![List of conflicts](../images/remove/SafeDeleteConflicts.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"Remove usages of `Address` by performing `Safe Delete`s on each entry i.e., double-click on the entry (which takes you to the code in concern, right-click on that entity, and choose `Refactor` -\u003e `Safe delete` as before). You will need to exercise discretion when removing usages of `Address`. Functions like `ParserUtil#parseAddress()` can be safely removed but its usages must be removed as well. Other usages like in `EditPersonDescriptor` may require more careful inspection.","lastModifiedDate":"2021-08-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"Let’s try removing references to `Address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"1. Safe delete the field `address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"1. Select `Yes` when prompted to remove getters and setters.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. Select `View Usages` again.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" ![UnsafeDeleteOnField](../images/remove/UnsafeDeleteOnField.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"1. Remove the usages of `address` and select `Do refactor` when you are done.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" :bulb: **Tip:** Removing usages may result in errors. Exercise discretion and fix them. For example, removing the `address` field from the `Person` class will require you to modify its constructor.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"1. Repeat the steps for the remaining usages of `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"After you are done, verify that the application still works by compiling and running it again.","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"### Manual refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"Unfortunately, there are usages of `Address` that IntelliJ IDEA cannot identify. You can find them by searching for instances of the word `address` in your code (`Edit` \\\u003e `Find` \\\u003e `Find in path`).","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"Places of interest to look out for would be resources used by the application. `main/resources` contains images and `fxml` files used by the application and `test/resources` contains test data. For example, there is a `$address` in each `PersonCard` that has not been removed nor identified.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"![$address](../images/remove/$address.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"A quick look at the `PersonCard` class and its `fxml` file quickly reveals why it slipped past the automated refactoring.","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"**`PersonCard.java`**","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"private Label address;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"**`PersonCard.fxml`**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"After removing the `Label`, we can proceed to formally test our code. If everything went well, you should have most of your tests pass. Fix any remaining errors until the tests all pass.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"## Tidying up","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"At this point, your application is working as intended and all your tests are passing. What’s left to do is to clean up references to `Address` in test data and documentation.","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"In `src/test/data/`, data meant for testing purposes are stored. While keeping the `address` field in the json files does not cause the tests to fail, it is not good practice to let cruft from old features accumulate.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**`invalidPersonAddressBook.json`:**","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"```json","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"{","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" \"persons\": [ {","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" \"name\": \"Person with invalid name field: Ha!ns Mu@ster\",","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \"phone\": \"9482424\",","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \"email\": \"hans@example.com\",","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \"address\": \"4th street\"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":" } ]","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"You can go through each individual `json` file and manually remove the `address` field.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"tsulim":1,"-":111}},{"path":"docs/tutorials/TracingCode.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Tracing code\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003e Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code. …​\\[Therefore,\\] making it easy to read makes it easier to write.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003e — Robert C. Martin Clean Code: A Handbook of Agile Software Craftsmanship","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"When trying to understand an unfamiliar code base, one common strategy used is to trace some representative execution path through the code base. One easy way to trace an execution path is to use a debugger to step through the code. In this tutorial, you will be using the IntelliJ IDEA’s debugger to trace the execution path of a specific user command.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## Before we start","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Before we jump into the code, it is useful to get an idea of the overall structure and the high-level behavior of the application. This is provided in the \u0027Architecture\u0027 section of the developer guide. In particular, the architecture diagram (reproduced below), tells us that the App consists of several components.","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"![ArchitectureDiagram](../images/ArchitectureDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"It also has a sequence diagram (reproduced below) that tells us how a command propagates through the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/ArchitectureSequenceDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"Note how the diagram shows only the execution flows _between_ the main components. That is, it does not show details of the execution path *inside* each component. By hiding those details, the diagram aims to inform the reader about the overall execution path of a command without overwhelming the reader with too much details. In this tutorial, you aim to find those omitted details so that you get a more in-depth understanding of how the code works.","lastModifiedDate":"2021-07-31"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"Before we proceed, ensure that you have done the following:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Read the [*Architecture* section of the DG](../DeveloperGuide.md#architecture)","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"1. Set up the project in Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"1. Learn basic debugging features of Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * If you are using a different IDE, we\u0027ll leave it to you to figure out the equivalent feature to use in your IDE.","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * If you are not using an IDE, we\u0027ll let you figure out how to achieve the same using your coding toolchain.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"## Setting a breakpoint","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"As you know, the first step of debugging is to put in a breakpoint where you want the debugger to pause the execution. For example, if you are trying to understand how the App starts up, you would put a breakpoint in the first statement of the `main` method.","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"In our case, we would want to begin the tracing at the very point where the App start processing user input (i.e., somewhere in the UI component), and then trace through how the execution proceeds through the UI component. However, the execution path through a GUI is often somewhat obscure due to various *event-driven mechanisms* used by GUI frameworks, which happens to be the case here too. Therefore, let us put the breakpoint where the `UI` transfers control to the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/ArchitectureSequenceDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":42,"author":{"gitId":"tsulim"},"content":"According to the sequence diagram you saw earlier (and repeated above for reference), the `UI` component yields control to the `Logic` component through a method named `execute`. Searching through the code base for an `execute()` method that belongs to the `Logic` component yields a promising candidate in `staffconnect.logic.address.Logic`.","lastModifiedDate":"2024-03-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/tracing/searchResultsForExecuteMethod.png\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":46,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":48,"author":{"gitId":"-"},"content":":bulb: **Intellij Tip:** The [\u0027**Search Everywhere**\u0027 feature](https://www.jetbrains.com/help/idea/searching-everywhere.html) can be used here. In particular, the \u0027**Find Symbol**\u0027 (\u0027Symbol\u0027 here refers to methods, variables, classes etc.) variant of that feature is quite useful here as we are looking for a _method_ named `execute`, not simply the text `execute`.","lastModifiedDate":"2021-07-31"},{"lineNumber":49,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":51,"author":{"gitId":"tsulim"},"content":"A quick look at the `staffconnect.logic.address.Logic` (an extract given below) confirms that this indeed might be what we’re looking for.","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":53,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2021-07-31"},{"lineNumber":54,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2021-07-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-07-31"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2021-07-31"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"But apparently, this is an interface, not a concrete implementation.","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"That should be fine because the [Architecture section of the Developer Guide](../DeveloperGuide.html#architecture) tells us that components interact through interfaces. Here\u0027s the relevant diagram:","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Next, let\u0027s find out which statement(s) in the `UI` code is calling this method, thus transferring control from the `UI` to the `Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":":bulb: **Intellij Tip:** The [\u0027**Find Usages**\u0027 feature](https://www.jetbrains.com/help/idea/find-highlight-usages.html#find-usages) can find from which parts of the code a class/method/variable is being used.","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"![`Find Usages` tool window. `Edit` \\\u003e `Find` \\\u003e `Find Usages`.](../images/tracing/FindUsages.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"Bingo\\! `MainWindow#executeCommand()` seems to be exactly what we’re looking for\\!","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Now let’s set the breakpoint. First, double-click the item to reach the corresponding code. Once there, click on the left gutter to set a breakpoint, as shown below.","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" ![LeftGutter](../images/tracing/LeftGutter.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"## Tracing the execution path","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Recall from the User Guide that the `edit` command has the format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` For this tutorial we will be issuing the command `edit 1 n/Alice Yeoh`.","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":":bulb: **Tip:** Over the course of the debugging session, you will encounter every major component in the application. Try to keep track of what happens inside the component and where the execution transfers to another component.","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"1. To start the debugging session, simply `Run` \\\u003e `Debug Main`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"1. When the GUI appears, enter `edit 1 n/Alice Yeoh` into the command box and press `Enter`.","lastModifiedDate":"2021-07-31"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"1. The Debugger tool window should show up and show something like this:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":" ![DebuggerStep1](../images/tracing/DebuggerStep1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"1. Use the _Show execution point_ feature to jump to the line of code that we stopped at:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" ![ShowExecutionPoint](../images/tracing/ShowExecutionPoint.png)\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":" `CommandResult commandResult \u003d logic.execute(commandText);` is the line that you end up at (i.e., the place where we put the breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. We are interested in the `logic.execute(commandText)` portion of that line so let’s _Step in_ into that method call:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" ![StepInto](../images/tracing/StepInto.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"1. We end up in `LogicManager#execute()` (not `Logic#execute` -- but this is expected because we know the `execute()` method in the `Logic` interface is actually implemented by the `LogicManager` class). Let’s take a look at the body of the method. Given below is the same code, with additional explanatory comments.","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":" **LogicManager\\#execute().**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText)","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" throws CommandException, ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" //Logging, safe to ignore","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" //Parse user input from String to a Command","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" //Executes the Command and stores the result","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" //We can deduce that the previous line of code modifies model in some way","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" // since it\u0027s being stored here.","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" throw new CommandException(FILE_OPS_ERROR_MESSAGE + ioe, ioe);","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"1. `LogicManager#execute()` appears to delegate most of the heavy lifting to other components. Let’s take a closer look at each one.","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"1. _Step over_ the logging code since it is of no interest to us now.","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" ![StepOver](../images/tracing/StepOver.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"1. _Step into_ the line where user input in parsed from a String to a Command, which should bring you to the `AddressBookParser#parseCommand()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"1. _Step over_ the statements in that method until you reach the `switch` statement. The \u0027Variables\u0027 window now shows the value of both `commandWord` and `arguments`:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":154,"author":{"gitId":"-"},"content":" ![Variables](../images/tracing/Variables.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"1. We see that the value of `commandWord` is now `edit` but `arguments` is still not processed in any meaningful way.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"1. Stepping through the `switch` block, we end up at a call to `EditCommandParser().parse()` as expected (because the command we typed is an edit command).","lastModifiedDate":"2021-07-31"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"1. Let’s see what `EditCommandParser#parse()` does by stepping into it. You might have to click the \u0027step into\u0027 button multiple times here because there are two method calls in that statement: `EditCommandParser()` and `parse()`.","lastModifiedDate":"2021-07-31"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Intellij Tip:** Sometimes, you might end up stepping into functions that are not of interest. Simply use the `step out` button to get out of them!","lastModifiedDate":"2021-07-31"},{"lineNumber":170,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"1. Stepping through the method shows that it calls `ArgumentTokenizer#tokenize()` and `ParserUtil#parseIndex()` to obtain the arguments and index required.","lastModifiedDate":"2021-07-31"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":174,"author":{"gitId":"-"},"content":"1. The rest of the method seems to exhaustively check for the existence of each possible parameter of the `edit` command and store any possible changes in an `EditPersonDescriptor`. Recall that we can verify the contents of `editPersonDesciptor` through the \u0027Variables\u0027 window.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":175,"author":{"gitId":"-"},"content":" ![EditCommand](../images/tracing/EditCommand.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"1. As you just traced through some code involved in parsing a command, you can take a look at this class diagram to see where the various parsing-related classes you encountered fit into the design of the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003cimg src\u003d\"../images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"1. Let’s continue stepping through until we return to `LogicManager#execute()`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" The sequence diagram below shows the details of the execution path through the Logic component. Does the execution path you traced in the code so far match the diagram?\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":183,"author":{"gitId":"-"},"content":" ![Tracing an `edit` command through the Logic component](../images/tracing/LogicSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"1. Now, step over until you read the statement that calls the `execute()` method of the `EditCommand` object received, and step into that `execute()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" **`EditCommand#execute()`:**","lastModifiedDate":"2021-07-31"},{"lineNumber":188,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, editedPerson));","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"1. As suspected, `command#execute()` does indeed make changes to the `model` object. Specifically,","lastModifiedDate":"2021-07-31"},{"lineNumber":204,"author":{"gitId":"-"},"content":" * it uses the `setPerson()` method (defined in the interface `Model` and implemented in `ModelManager` as per the usual pattern) to update the person data.","lastModifiedDate":"2021-07-31"},{"lineNumber":205,"author":{"gitId":"-"},"content":" * it uses the `updateFilteredPersonList` method to ask the `Model` to populate the \u0027filtered list\u0027 with _all_ persons.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":206,"author":{"gitId":"-"},"content":" FYI, The \u0027filtered list\u0027 is the list of persons resulting from the most recent operation that will be shown to the user immediately after. For the `edit` command, we populate it with all the persons so that the user can see the edited person along with all other persons. If this was a `find` command, we would be setting that list to contain the search results instead.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":207,"author":{"gitId":"-"},"content":" To provide some context, given below is the class diagram of the `Model` component. See if you can figure out where the \u0027filtered list\u0027 of persons is being tracked.","lastModifiedDate":"2021-07-31"},{"lineNumber":208,"author":{"gitId":"-"},"content":" \u003cimg src\u003d\"../images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":209,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Model` component section of the DG](../DeveloperGuide.html#model-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"1. As you step through the rest of the statements in the `EditCommand#execute()` method, you\u0027ll see that it creates a `CommandResult` object (containing information about the result of the execution) and returns it.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":212,"author":{"gitId":"-"},"content":" Advancing the debugger by one more step should take you back to the middle of the `LogicManager#execute()` method.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"1. Given that you have already seen quite a few classes in the `Logic` component in action, see if you can identify in this partial class diagram some of the classes you\u0027ve encountered so far, and see how they fit into the class structure of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":215,"author":{"gitId":"-"},"content":" \u003cimg src\u003d\"../images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":216,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Logic` component section of the DG](../DeveloperGuide.html#logic-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"1. Similar to before, you can step over/into statements in the `LogicManager#execute()` method to examine how the control is transferred to the `Storage` component and what happens inside that component.","lastModifiedDate":"2021-07-31"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":220,"author":{"gitId":"-"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Intellij Tip:** When trying to step into a statement such as `storage.saveAddressBook(model.getAddressBook())` which contains multiple method calls, Intellij will let you choose (by clicking) which one you want to step into.","lastModifiedDate":"2021-07-31"},{"lineNumber":221,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"1. As you step through the code inside the `Storage` component, you will eventually arrive at the `JsonAddressBook#saveAddressBook()` method which calls the `JsonSerializableAddressBook` constructor, to create an object that can be _serialized_ (i.e., stored in storage medium) in JSON format. That constructor is given below (with added line breaks for easier readability):","lastModifiedDate":"2021-07-31"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":" **`JsonSerializableAddressBook` constructor:**","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * {@code JsonSerializableAddressBook}.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" persons.addAll(","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" source.getPersonList()","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .stream()","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .map(JsonAdaptedPerson::new)","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"1. It appears that a `JsonAdaptedPerson` is created for each `Person` and then added to the `JsonSerializableAddressBook`.","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":" This is because regular Java objects need to go through an _adaptation_ for them to be suitable to be saved in JSON format.","lastModifiedDate":"2021-07-31"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"1. While you are stepping through the classes in the `Storage` component, here is the component\u0027s class diagram to help you understand how those classes fit into the structure of the component.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":246,"author":{"gitId":"-"},"content":" \u003cimg src\u003d\"../images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Storage` component section of the DG](../DeveloperGuide.html#storage-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"1. We can continue to step through until you reach the end of the `LogicManager#execute()` method and return to the `MainWindow#executeCommand()` method (the place where we put the original breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"1. Stepping into `resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());`, we end up in:","lastModifiedDate":"2021-07-31"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" **`ResultDisplay#setFeedbackToUser()`**","lastModifiedDate":"2021-07-31"},{"lineNumber":254,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"1. Finally, you can step through until you reach the end of`MainWindow#executeCommand()`.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":262,"author":{"gitId":"-"},"content":" :bulb: This may be a good time to read through the [`UI` component section of the DG](../DeveloperGuide.html#ui-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"In this tutorial, we traced a valid edit command from raw user input to the result being displayed to the user. From this tutorial, you learned more about how the various components work together to produce a response to a user command.","lastModifiedDate":"2021-07-31"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"Here are some quick questions you can try to answer based on your execution path tracing. In some cases, you can do further tracing for the given commands to find exactly what happens.","lastModifiedDate":"2021-07-31"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"1. In this tutorial, we traced the \"happy path\" (i.e., no errors). What","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":" do you think will happen if we traced the following commands","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":" instead? What exceptions do you think will be thrown (if any), where","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":" will the exceptions be thrown and where will they be handled?","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":" 1. `redit 1 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":" 2. `edit 0 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":" 3. `edit 1 n/Alex Yeoh`","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" 4. `edit 1`","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":" 5. `edit 1 n/アリス ユー`","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":" 6. `edit 1 t/one t/two t/three t/one`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"2. What components will you have to modify to perform the following","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":" enhancements to the application?","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":" 1. Make command words case-insensitive","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":" 2. Allow `delete` to remove more than one index at a time","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":" 3. Save the address book in the CSV format instead","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":" 4. Add a new command","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":" 5. Add a new field to `Person`","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":" 6. Add a new entity to the address book","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"tsulim":2,"-":299}},{"path":"src/main/java/staffconnect/AppParameters.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.FileUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Represents the parsed command-line parameters given to the application.","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class AppParameters {","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AppParameters.class);","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Path configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public Path getConfigPath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setConfigPath(Path configPath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.configPath \u003d configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Parses the application command-line parameters.","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static AppParameters parse(Application.Parameters parameters) {","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" Map\u003cString, String\u003e namedParameters \u003d parameters.getNamed();","lastModifiedDate":"2018-04-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" String configPathParameter \u003d namedParameters.get(\"config\");","lastModifiedDate":"2018-04-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (configPathParameter !\u003d null \u0026\u0026 !FileUtil.isValidPath(configPathParameter)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" logger.warning(\"Invalid config path \" + configPathParameter + \". Using default config path.\");","lastModifiedDate":"2018-04-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" configPathParameter \u003d null;","lastModifiedDate":"2018-04-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" appParameters.setConfigPath(configPathParameter !\u003d null ? Paths.get(configPathParameter) : null);","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return appParameters;","lastModifiedDate":"2018-04-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-04-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (!(other instanceof AppParameters)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" AppParameters otherAppParameters \u003d (AppParameters) other;","lastModifiedDate":"2018-04-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return Objects.equals(configPath, otherAppParameters.configPath);","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return configPath.hashCode();","lastModifiedDate":"2018-04-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .add(\"configPath\", configPath)","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-04-21"}],"authorContributionMap":{"tsulim":4,"-":69}},{"path":"src/main/java/staffconnect/Main.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2019-02-08"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2019-02-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * The main entry point to the application.","lastModifiedDate":"2019-02-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * This is a workaround for the following error when MainApp is made the","lastModifiedDate":"2019-02-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * entry point of the application:","lastModifiedDate":"2019-02-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Error: JavaFX runtime components are missing, and are required to run this application","lastModifiedDate":"2019-02-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The reason is that MainApp extends Application. In that case, the","lastModifiedDate":"2019-02-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * LauncherHelper will check for the javafx.graphics module to be present","lastModifiedDate":"2019-02-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * as a named module. We don\u0027t use JavaFX via the module system so it can\u0027t","lastModifiedDate":"2019-02-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * find the javafx.graphics module, and so the launch is aborted.","lastModifiedDate":"2019-02-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * By having a separate main class (Main) that doesn\u0027t extend Application","lastModifiedDate":"2019-02-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * to be the entry point of the application, we avoid this issue.","lastModifiedDate":"2019-02-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class Main {","lastModifiedDate":"2019-02-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static Logger logger \u003d LogsCenter.getLogger(Main.class);","lastModifiedDate":"2023-07-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static void main(String[] args) {","lastModifiedDate":"2019-02-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // As per https://github.com/openjdk/jfx/blob/master/doc-files/release-notes-16.md","lastModifiedDate":"2023-07-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // JavaFX 16 (or later) runtime logs a warning at startup if JavaFX classes are loaded from","lastModifiedDate":"2023-07-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // the classpath instead of a module.","lastModifiedDate":"2023-07-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // Our application does not use Java modules yet. Even if it did, modules are ignored when","lastModifiedDate":"2023-07-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // packed into a FAT Jar file (as we do), which means this warning will persist even then.","lastModifiedDate":"2023-07-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // The warning however, can be safely ignored. Thus, the following log informs","lastModifiedDate":"2023-07-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // the user (if looking at the log output) that the said warning appearing in the log","lastModifiedDate":"2023-07-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // can be ignored.","lastModifiedDate":"2023-07-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" logger.warning(\"The warning about Unsupported JavaFX configuration below can be ignored.\");","lastModifiedDate":"2023-07-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Application.launch(MainApp.class, args);","lastModifiedDate":"2019-02-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-08"}],"authorContributionMap":{"tsulim":2,"-":39}},{"path":"src/main/java/staffconnect/MainApp.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2016-08-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-26"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.Config;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.Version;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ConfigUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.StringUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Logic;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.LogicManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.util.SampleDataUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.AddressBookStorage;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.JsonAddressBookStorage;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.JsonUserPrefsStorage;","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.Storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.StorageManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.UserPrefsStorage;","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":"import staffconnect.ui.Ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":"import staffconnect.ui.UiManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Runs the application.","lastModifiedDate":"2019-02-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"public class MainApp extends Application {","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final Version VERSION \u003d new Version(0, 2, 2, true);","lastModifiedDate":"2023-08-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(MainApp.class);","lastModifiedDate":"2017-04-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" protected Ui ui;","lastModifiedDate":"2016-09-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" protected Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" protected Storage storage;","lastModifiedDate":"2016-09-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" protected Model model;","lastModifiedDate":"2016-09-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" protected Config config;","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void init() throws Exception {","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" logger.info(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d[ Initializing AddressBook ]\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\");","lastModifiedDate":"2016-09-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" super.init();","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d AppParameters.parse(getParameters());","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" config \u003d initConfig(appParameters.getConfigPath());","lastModifiedDate":"2018-04-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" initLogging(config);","lastModifiedDate":"2023-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" UserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(config.getUserPrefsFilePath());","lastModifiedDate":"2017-02-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d initPrefs(userPrefsStorage);","lastModifiedDate":"2018-12-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" AddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(userPrefs.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2017-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" model \u003d initModelManager(storage, userPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" ui \u003d new UiManager(logic);","lastModifiedDate":"2018-12-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Returns a {@code ModelManager} with the data from {@code storage}\u0027s address book and {@code userPrefs}. \u003cbr\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * The data from the sample address book will be used instead if {@code storage}\u0027s address book is not found,","lastModifiedDate":"2017-08-16"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * or an empty address book will be used instead if errors occur when reading {@code storage}\u0027s address book.","lastModifiedDate":"2017-08-16"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" logger.info(\"Using data file : \" + storage.getAddressBookFilePath());","lastModifiedDate":"2023-07-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e addressBookOptional;","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook initialData;","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" addressBookOptional \u003d storage.readAddressBook();","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" if (!addressBookOptional.isPresent()) {","lastModifiedDate":"2016-09-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" logger.info(\"Creating a new data file \" + storage.getAddressBookFilePath()","lastModifiedDate":"2023-05-15"},{"lineNumber":84,"author":{"gitId":"-"},"content":" + \" populated with a sample AddressBook.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" initialData \u003d addressBookOptional.orElseGet(SampleDataUtil::getSampleAddressBook);","lastModifiedDate":"2016-12-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" logger.warning(\"Data file at \" + storage.getAddressBookFilePath() + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" + \" Will be starting with an empty AddressBook.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" initialData \u003d new AddressBook();","lastModifiedDate":"2016-09-24"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return new ModelManager(initialData, userPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private void initLogging(Config config) {","lastModifiedDate":"2016-09-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":" LogsCenter.init(config);","lastModifiedDate":"2016-09-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * Returns a {@code Config} using the file at {@code configFilePath}. \u003cbr\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * The default file path {@code Config#DEFAULT_CONFIG_FILE} will be used instead","lastModifiedDate":"2017-08-16"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * if {@code configFilePath} is null.","lastModifiedDate":"2017-08-16"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":105,"author":{"gitId":"-"},"content":" protected Config initConfig(Path configFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Config initializedConfig;","lastModifiedDate":"2016-09-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Path configFilePathUsed;","lastModifiedDate":"2018-04-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" configFilePathUsed \u003d Config.DEFAULT_CONFIG_FILE;","lastModifiedDate":"2016-09-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (configFilePath !\u003d null) {","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" logger.info(\"Custom Config file specified \" + configFilePath);","lastModifiedDate":"2016-09-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" configFilePathUsed \u003d configFilePath;","lastModifiedDate":"2016-09-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" logger.info(\"Using config file : \" + configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Optional\u003cConfig\u003e configOptional \u003d ConfigUtil.readConfig(configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" if (!configOptional.isPresent()) {","lastModifiedDate":"2023-01-03"},{"lineNumber":121,"author":{"gitId":"-"},"content":" logger.info(\"Creating new config file \" + configFilePathUsed);","lastModifiedDate":"2023-05-15"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-01-03"},{"lineNumber":123,"author":{"gitId":"-"},"content":" initializedConfig \u003d configOptional.orElse(new Config());","lastModifiedDate":"2016-09-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" logger.warning(\"Config file at \" + configFilePathUsed + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":126,"author":{"gitId":"-"},"content":" + \" Using default config properties.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":127,"author":{"gitId":"-"},"content":" initializedConfig \u003d new Config();","lastModifiedDate":"2016-09-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":130,"author":{"gitId":"-"},"content":" //Update config file in case it was missing to begin with or there are new/unused fields","lastModifiedDate":"2016-09-24"},{"lineNumber":131,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(initializedConfig, configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":133,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":134,"author":{"gitId":"-"},"content":" logger.warning(\"Failed to save config file : \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return initializedConfig;","lastModifiedDate":"2016-09-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":140,"author":{"gitId":"-"},"content":" * Returns a {@code UserPrefs} using the file at {@code storage}\u0027s user prefs file path,","lastModifiedDate":"2017-08-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" * or a new {@code UserPrefs} with default configuration if errors occur when","lastModifiedDate":"2017-08-16"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * reading from the file.","lastModifiedDate":"2017-08-16"},{"lineNumber":143,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":144,"author":{"gitId":"-"},"content":" protected UserPrefs initPrefs(UserPrefsStorage storage) {","lastModifiedDate":"2017-02-25"},{"lineNumber":145,"author":{"gitId":"-"},"content":" Path prefsFilePath \u003d storage.getUserPrefsFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":" logger.info(\"Using preference file : \" + prefsFilePath);","lastModifiedDate":"2023-05-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":148,"author":{"gitId":"-"},"content":" UserPrefs initializedPrefs;","lastModifiedDate":"2016-09-24"},{"lineNumber":149,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":150,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e prefsOptional \u003d storage.readUserPrefs();","lastModifiedDate":"2016-09-25"},{"lineNumber":151,"author":{"gitId":"-"},"content":" if (!prefsOptional.isPresent()) {","lastModifiedDate":"2023-01-03"},{"lineNumber":152,"author":{"gitId":"-"},"content":" logger.info(\"Creating new preference file \" + prefsFilePath);","lastModifiedDate":"2023-05-15"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-01-03"},{"lineNumber":154,"author":{"gitId":"-"},"content":" initializedPrefs \u003d prefsOptional.orElse(new UserPrefs());","lastModifiedDate":"2016-09-24"},{"lineNumber":155,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":156,"author":{"gitId":"-"},"content":" logger.warning(\"Preference file at \" + prefsFilePath + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" + \" Using default preferences.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":" initializedPrefs \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" //Update prefs file in case it was missing to begin with or there are new/unused fields","lastModifiedDate":"2016-09-24"},{"lineNumber":162,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":163,"author":{"gitId":"-"},"content":" storage.saveUserPrefs(initializedPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":164,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":165,"author":{"gitId":"-"},"content":" logger.warning(\"Failed to save config file : \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":168,"author":{"gitId":"-"},"content":" return initializedPrefs;","lastModifiedDate":"2016-09-24"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":171,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public void start(Stage primaryStage) {","lastModifiedDate":"2016-08-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":" logger.info(\"Starting AddressBook \" + MainApp.VERSION);","lastModifiedDate":"2016-09-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" ui.start(primaryStage);","lastModifiedDate":"2016-09-25"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":177,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":178,"author":{"gitId":"-"},"content":" public void stop() {","lastModifiedDate":"2016-08-08"},{"lineNumber":179,"author":{"gitId":"-"},"content":" logger.info(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d [ Stopping Address Book ] \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\");","lastModifiedDate":"2016-09-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":181,"author":{"gitId":"-"},"content":" storage.saveUserPrefs(model.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":182,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":183,"author":{"gitId":"-"},"content":" logger.severe(\"Failed to save preferences \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":184,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":24,"-":162}},{"path":"src/main/java/staffconnect/commons/core/Config.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2016-09-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Config values used by the app","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Config {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final Path DEFAULT_CONFIG_FILE \u003d Paths.get(\"config.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" // Config values customizable through config file","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private Level logLevel \u003d Level.INFO;","lastModifiedDate":"2016-09-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private Path userPrefsFilePath \u003d Paths.get(\"preferences.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public Level getLogLevel() {","lastModifiedDate":"2016-09-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return logLevel;","lastModifiedDate":"2016-09-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void setLogLevel(Level logLevel) {","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.logLevel \u003d logLevel;","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return userPrefsFilePath;","lastModifiedDate":"2016-09-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefsFilePath(Path userPrefsFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.userPrefsFilePath \u003d userPrefsFilePath;","lastModifiedDate":"2016-09-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof Config)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Config otherConfig \u003d (Config) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return Objects.equals(logLevel, otherConfig.logLevel)","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(userPrefsFilePath, otherConfig.userPrefsFilePath);","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Objects.hash(logLevel, userPrefsFilePath);","lastModifiedDate":"2018-12-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .add(\"logLevel\", logLevel)","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .add(\"userPrefsFilePath\", userPrefsFilePath)","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":2,"-":64}},{"path":"src/main/java/staffconnect/commons/core/GuiSettings.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.awt.Point;","lastModifiedDate":"2017-01-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.Serializable;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * A Serializable class that contains the GUI settings.","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Guarantees: immutable.","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class GuiSettings implements Serializable {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final double DEFAULT_HEIGHT \u003d 600;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final double DEFAULT_WIDTH \u003d 740;","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final double windowWidth;","lastModifiedDate":"2018-11-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private final double windowHeight;","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Point windowCoordinates;","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code GuiSettings} with the default height, width and position.","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public GuiSettings() {","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" windowWidth \u003d DEFAULT_WIDTH;","lastModifiedDate":"2018-08-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" windowHeight \u003d DEFAULT_HEIGHT;","lastModifiedDate":"2018-08-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" windowCoordinates \u003d null; // null represent no coordinates","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Constructs a {@code GuiSettings} with the specified height, width and position.","lastModifiedDate":"2020-05-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public GuiSettings(double windowWidth, double windowHeight, int xPosition, int yPosition) {","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.windowWidth \u003d windowWidth;","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.windowHeight \u003d windowHeight;","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" windowCoordinates \u003d new Point(xPosition, yPosition);","lastModifiedDate":"2018-08-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public double getWindowWidth() {","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" return windowWidth;","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public double getWindowHeight() {","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return windowHeight;","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public Point getWindowCoordinates() {","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return windowCoordinates !\u003d null ? new Point(windowCoordinates) : null;","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (!(other instanceof GuiSettings)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" GuiSettings otherGuiSettings \u003d (GuiSettings) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return windowWidth \u003d\u003d otherGuiSettings.windowWidth","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u0026\u0026 windowHeight \u003d\u003d otherGuiSettings.windowHeight","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(windowCoordinates, otherGuiSettings.windowCoordinates);","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return Objects.hash(windowWidth, windowHeight, windowCoordinates);","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .add(\"windowWidth\", windowWidth)","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .add(\"windowHeight\", windowHeight)","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .add(\"windowCoordinates\", windowCoordinates)","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":2,"-":80}},{"path":"src/main/java/staffconnect/commons/core/LogsCenter.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2023-05-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-05-20"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.ConsoleHandler;","lastModifiedDate":"2017-01-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.FileHandler;","lastModifiedDate":"2017-01-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.SimpleFormatter;","lastModifiedDate":"2017-01-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Configures and manages loggers and handlers, including their logging level","lastModifiedDate":"2016-09-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Named {@link Logger}s can be obtained from this class\u003cbr\u003e","lastModifiedDate":"2016-09-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * These loggers have been configured to output messages to the console and a {@code .log} file by default,","lastModifiedDate":"2016-09-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * at the {@code INFO} level. A new {@code .log} file with a new numbering will be created after the log","lastModifiedDate":"2016-09-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * file reaches 5MB big, up to a maximum of 5 files.\u003cbr\u003e","lastModifiedDate":"2016-09-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class LogsCenter {","lastModifiedDate":"2016-09-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final int MAX_FILE_COUNT \u003d 5;","lastModifiedDate":"2016-09-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final int MAX_FILE_SIZE_IN_BYTES \u003d (int) (Math.pow(2, 20) * 5); // 5MB","lastModifiedDate":"2016-09-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String LOG_FILE \u003d \"addressbook.log\";","lastModifiedDate":"2016-09-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final Logger logger; // logger for this class","lastModifiedDate":"2023-07-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static Logger baseLogger; // to be used as the parent of all other loggers created by this class.","lastModifiedDate":"2023-07-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static Level currentLogLevel \u003d Level.INFO;","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // This static block ensures essential loggers are created early","lastModifiedDate":"2023-07-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2023-07-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" setBaseLogger();","lastModifiedDate":"2023-07-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" logger \u003d LogsCenter.getLogger(LogsCenter.class);","lastModifiedDate":"2023-07-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Initializes loggers with the log level specified in the {@code config} object. Applies to all loggers created","lastModifiedDate":"2023-07-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * using {@link #getLogger(String)} and {@link #getLogger(Class)} methods except for those that are manually set.","lastModifiedDate":"2023-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static void init(Config config) {","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" currentLogLevel \u003d config.getLogLevel();","lastModifiedDate":"2016-09-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" logger.info(\"Log level will be set as: \" + currentLogLevel);","lastModifiedDate":"2023-07-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // set the level of the baseLogger which will be inherited by other loggers","lastModifiedDate":"2023-07-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" baseLogger.setLevel(currentLogLevel);","lastModifiedDate":"2023-07-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Creates a logger with the given name prefixed by the {@code baseLogger}\u0027s name so that the created logger","lastModifiedDate":"2023-07-19"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * becomes a descendant of the {@code baseLogger}. Furthermore, the returned logger will have the same log handlers","lastModifiedDate":"2023-07-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * as the {@code baseLogger}.","lastModifiedDate":"2023-07-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static Logger getLogger(String name) {","lastModifiedDate":"2016-09-28"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Java organizes loggers into a hierarchy based on their names (using \u0027.\u0027 as a separator, similar to how Java","lastModifiedDate":"2023-07-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // packages form a hierarchy). Furthermore, loggers without a level inherit the level of their parent logger.","lastModifiedDate":"2023-07-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // By prefixing names of all loggers with baseLogger\u0027s name + \".\", we make the baseLogger the parent of all","lastModifiedDate":"2023-07-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // loggers. This allows us to change the level of all loggers simply by changing the baseLogger level.","lastModifiedDate":"2023-07-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Logger logger \u003d Logger.getLogger(baseLogger.getName() + \".\" + name);","lastModifiedDate":"2023-07-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" removeHandlers(logger);","lastModifiedDate":"2016-09-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":" logger.setUseParentHandlers(true);","lastModifiedDate":"2023-07-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return logger;","lastModifiedDate":"2023-07-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Creates a Logger for the given class name.","lastModifiedDate":"2017-01-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Logger getLogger(Class\u003cT\u003e clazz) {","lastModifiedDate":"2017-01-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" requireNonNull(clazz);","lastModifiedDate":"2023-05-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return getLogger(clazz.getSimpleName());","lastModifiedDate":"2017-01-16"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Removes all handlers from the {@code logger}.","lastModifiedDate":"2023-07-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static void removeHandlers(Logger logger) {","lastModifiedDate":"2016-09-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Arrays.stream(logger.getHandlers())","lastModifiedDate":"2018-01-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .forEach(logger::removeHandler);","lastModifiedDate":"2018-01-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Creates a logger named \u0027ab3\u0027, containing a {@code ConsoleHandler} and a {@code FileHandler}.","lastModifiedDate":"2023-07-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Sets it as the {@code baseLogger}, to be used as the parent logger of all other loggers.","lastModifiedDate":"2023-07-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static void setBaseLogger() {","lastModifiedDate":"2023-07-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" baseLogger \u003d Logger.getLogger(\"ab3\");","lastModifiedDate":"2023-07-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" baseLogger.setUseParentHandlers(false);","lastModifiedDate":"2023-07-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" removeHandlers(baseLogger);","lastModifiedDate":"2023-07-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" // Level.ALL is used as the level for the handlers because the baseLogger filters the log messages by level","lastModifiedDate":"2023-07-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // already; there is no need to control log message level of the handlers.","lastModifiedDate":"2023-07-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // add a ConsoleHandler to log to the console","lastModifiedDate":"2023-07-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" ConsoleHandler consoleHandler \u003d new ConsoleHandler();","lastModifiedDate":"2023-07-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" consoleHandler.setLevel(Level.ALL);","lastModifiedDate":"2023-07-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" baseLogger.addHandler(consoleHandler);","lastModifiedDate":"2023-07-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // add a FileHandler to log to a file","lastModifiedDate":"2023-07-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-09"},{"lineNumber":96,"author":{"gitId":"-"},"content":" FileHandler fileHandler \u003d new FileHandler(LOG_FILE, MAX_FILE_SIZE_IN_BYTES, MAX_FILE_COUNT, true);","lastModifiedDate":"2023-07-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" fileHandler.setFormatter(new SimpleFormatter());","lastModifiedDate":"2023-07-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" fileHandler.setLevel(Level.ALL);","lastModifiedDate":"2023-07-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" baseLogger.addHandler(fileHandler);","lastModifiedDate":"2023-07-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-09"},{"lineNumber":101,"author":{"gitId":"-"},"content":" logger.warning(\"Error adding file handler for logger.\");","lastModifiedDate":"2016-09-09"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":1,"-":105}},{"path":"src/main/java/staffconnect/commons/core/Version.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Represents a version with major, minor and patch number","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Version implements Comparable\u003cVersion\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String VERSION_REGEX \u003d \"V(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)(ea)?\";","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String EXCEPTION_STRING_NOT_VERSION \u003d \"String is not a valid Version. %s\";","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Pattern VERSION_PATTERN \u003d Pattern.compile(VERSION_REGEX);","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final int major;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final int minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final int patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final boolean isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code Version} with the given version details.","lastModifiedDate":"2020-05-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public Version(int major, int minor, int patch, boolean isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.major \u003d major;","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.minor \u003d minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.patch \u003d patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.isEarlyAccess \u003d isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public int getMajor() {","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return major;","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public int getMinor() {","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public int getPatch() {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean isEarlyAccess() {","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Parses a version number string in the format V1.2.3.","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * @param versionString version number string","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * @return a Version object","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static Version fromString(String versionString) throws IllegalArgumentException {","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Matcher versionMatcher \u003d VERSION_PATTERN.matcher(versionString);","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" if (!versionMatcher.find()) {","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(String.format(EXCEPTION_STRING_NOT_VERSION, versionString));","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new Version(Integer.parseInt(versionMatcher.group(1)),","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Integer.parseInt(versionMatcher.group(2)),","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" Integer.parseInt(versionMatcher.group(3)),","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" versionMatcher.group(4) \u003d\u003d null ? false : true);","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @JsonValue","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return String.format(\"V%d.%d.%d%s\", major, minor, patch, isEarlyAccess ? \"ea\" : \"\");","lastModifiedDate":"2016-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public int compareTo(Version other) {","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (major !\u003d other.major) {","lastModifiedDate":"2018-08-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return major - other.major;","lastModifiedDate":"2018-08-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" if (minor !\u003d other.minor) {","lastModifiedDate":"2018-08-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return minor - other.minor;","lastModifiedDate":"2018-08-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":83,"author":{"gitId":"-"},"content":" if (patch !\u003d other.patch) {","lastModifiedDate":"2018-08-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return patch - other.patch;","lastModifiedDate":"2018-08-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (isEarlyAccess \u003d\u003d other.isEarlyAccess()) {","lastModifiedDate":"2018-08-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return 0;","lastModifiedDate":"2017-05-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (isEarlyAccess) {","lastModifiedDate":"2018-08-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return -1;","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return 1;","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (!(other instanceof Version)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Version otherVersion \u003d (Version) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return major \u003d\u003d otherVersion.major","lastModifiedDate":"2023-07-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \u0026\u0026 minor \u003d\u003d otherVersion.minor","lastModifiedDate":"2023-07-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \u0026\u0026 patch \u003d\u003d otherVersion.patch","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" \u0026\u0026 isEarlyAccess \u003d\u003d otherVersion.isEarlyAccess;","lastModifiedDate":"2023-07-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" String hash \u003d String.format(\"%03d%03d%03d\", major, minor, patch);","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" if (!isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" hash \u003d \"1\" + hash;","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return Integer.parseInt(hash);","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":1,"-":120}},{"path":"src/main/java/staffconnect/commons/core/index/Index.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core.index;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Represents a zero-based or one-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * {@code Index} should be used right from the start (when parsing in a new user input), so that if the current","lastModifiedDate":"2017-05-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * component wants to communicate with another component, it can send an {@code Index} to avoid having to know what","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * base the other component is using for its index. However, after receiving the {@code Index}, that component can","lastModifiedDate":"2017-05-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * convert it back to an int if the index will not be passed to a different component again.","lastModifiedDate":"2017-05-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Index {","lastModifiedDate":"2017-05-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private int zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Index can only be created by calling {@link Index#fromZeroBased(int)} or","lastModifiedDate":"2017-05-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * {@link Index#fromOneBased(int)}.","lastModifiedDate":"2017-05-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Index(int zeroBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" if (zeroBasedIndex \u003c 0) {","lastModifiedDate":"2017-05-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" throw new IndexOutOfBoundsException();","lastModifiedDate":"2017-05-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" this.zeroBasedIndex \u003d zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public int getZeroBased() {","lastModifiedDate":"2017-05-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public int getOneBased() {","lastModifiedDate":"2017-05-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return zeroBasedIndex + 1;","lastModifiedDate":"2017-05-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Creates a new {@code Index} using a zero-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static Index fromZeroBased(int zeroBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return new Index(zeroBasedIndex);","lastModifiedDate":"2017-05-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Creates a new {@code Index} using a one-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static Index fromOneBased(int oneBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return new Index(oneBasedIndex - 1);","lastModifiedDate":"2017-05-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (!(other instanceof Index)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Index otherIndex \u003d (Index) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return zeroBasedIndex \u003d\u003d otherIndex.zeroBasedIndex;","lastModifiedDate":"2023-07-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"zeroBasedIndex\", zeroBasedIndex).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"tsulim":2,"-":67}},{"path":"src/main/java/staffconnect/commons/exceptions/DataLoadingException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.exceptions;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-14"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2023-06-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents an error during loading of data from a file.","lastModifiedDate":"2023-06-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-06-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class DataLoadingException extends Exception {","lastModifiedDate":"2023-06-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public DataLoadingException(Exception cause) {","lastModifiedDate":"2023-06-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(cause);","lastModifiedDate":"2023-06-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-14"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2023-06-14"}],"authorContributionMap":{"tsulim":1,"-":10}},{"path":"src/main/java/staffconnect/commons/exceptions/IllegalValueException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.exceptions;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that some given data does not fulfill some constraints.","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class IllegalValueException extends Exception {","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * @param message should contain relevant information on the failed constraint(s)","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public IllegalValueException(String message) {","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * @param message should contain relevant information on the failed constraint(s)","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * @param cause of the main exception","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public IllegalValueException(String message, Throwable cause) {","lastModifiedDate":"2017-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":1,"-":20}},{"path":"src/main/java/staffconnect/commons/util/AppUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.scene.image.Image;","lastModifiedDate":"2016-08-18"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.MainApp;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * A container for App specific utility functions","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AppUtil {","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Gets an {@code Image} from the specified path.","lastModifiedDate":"2020-05-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static Image getImage(String imagePath) {","lastModifiedDate":"2016-08-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":" requireNonNull(imagePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" return new Image(MainApp.class.getResourceAsStream(imagePath));","lastModifiedDate":"2016-08-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Checks that {@code condition} is true. Used for validating arguments to methods.","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException if {@code condition} is false.","lastModifiedDate":"2017-05-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static void checkArgument(Boolean condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (!condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException();","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Checks that {@code condition} is true. Used for validating arguments to methods.","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException with {@code errorMessage} if {@code condition} is false.","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static void checkArgument(Boolean condition, String errorMessage) {","lastModifiedDate":"2017-05-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (!condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(errorMessage);","lastModifiedDate":"2017-05-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"tsulim":2,"-":40}},{"path":"src/main/java/staffconnect/commons/util/CollectionUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-06-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-30"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2016-12-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Utility methods related to Collections","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class CollectionUtil {","lastModifiedDate":"2016-09-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /** @see #requireAllNonNull(Collection) */","lastModifiedDate":"2017-05-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static void requireAllNonNull(Object... items) {","lastModifiedDate":"2017-05-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":" requireNonNull(items);","lastModifiedDate":"2017-06-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Stream.of(items).forEach(Objects::requireNonNull);","lastModifiedDate":"2017-05-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Throws NullPointerException if {@code items} or any element of {@code items} is null.","lastModifiedDate":"2017-05-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static void requireAllNonNull(Collection\u003c?\u003e items) {","lastModifiedDate":"2017-05-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(items);","lastModifiedDate":"2017-06-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" items.forEach(Objects::requireNonNull);","lastModifiedDate":"2017-05-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns true if {@code items} contain any elements that are non-null.","lastModifiedDate":"2017-06-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static boolean isAnyNonNull(Object... items) {","lastModifiedDate":"2017-06-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return items !\u003d null \u0026\u0026 Arrays.stream(items).anyMatch(Objects::nonNull);","lastModifiedDate":"2017-06-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":1,"-":34}},{"path":"src/main/java/staffconnect/commons/util/ConfigUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.Config;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * A class for accessing the Config File.","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class ConfigUtil {","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static Optional\u003cConfig\u003e readConfig(Path configFilePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":16,"author":{"gitId":"-"},"content":" return JsonUtil.readJsonFile(configFilePath, Config.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static void saveConfig(Config config, Path configFilePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(config, configFilePath);","lastModifiedDate":"2016-10-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"tsulim":3,"-":20}},{"path":"src/main/java/staffconnect/commons/util/FileUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2016-08-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.InvalidPathException;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Writes and reads files","lastModifiedDate":"2016-10-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class FileUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String CHARSET \u003d \"UTF-8\";","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static boolean isFileExists(Path file) {","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" return Files.exists(file) \u0026\u0026 Files.isRegularFile(file);","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Returns true if {@code path} can be converted into a {@code Path} via {@link Paths#get(String)},","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * otherwise returns false.","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param path A string representing the file path. Cannot be null.","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static boolean isValidPath(String path) {","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Paths.get(path);","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" } catch (InvalidPathException ipe) {","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Creates a file if it does not exist along with its missing parent directories.","lastModifiedDate":"2017-08-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @throws IOException if the file or directory cannot be created.","lastModifiedDate":"2017-08-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static void createIfMissing(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (!isFileExists(file)) {","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" createFile(file);","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Creates a file if it does not exist along with its missing parent directories.","lastModifiedDate":"2018-04-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static void createFile(Path file) throws IOException {","lastModifiedDate":"2018-04-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (Files.exists(file)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2018-04-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" createParentDirsOfFile(file);","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Files.createFile(file);","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Creates parent directories of file if it has a parent directory","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static void createParentDirsOfFile(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Path parentDir \u003d file.getParent();","lastModifiedDate":"2018-04-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (parentDir !\u003d null) {","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Files.createDirectories(parentDir);","lastModifiedDate":"2018-04-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Assumes file exists","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static String readFromFile(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return new String(Files.readAllBytes(file), CHARSET);","lastModifiedDate":"2018-04-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Writes given string to a file.","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Will create the file if it does not exist yet.","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static void writeToFile(Path file, String content) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Files.write(file, content.getBytes(CHARSET));","lastModifiedDate":"2018-04-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":1,"-":82}},{"path":"src/main/java/staffconnect/commons/util/JsonUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonAutoDetect;","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.PropertyAccessor;","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.core.JsonProcessingException;","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationContext;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationFeature;","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ObjectMapper;","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.SerializationFeature;","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.module.SimpleModule;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Converts a Java object instance to JSON and vice versa","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class JsonUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonUtil.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static ObjectMapper objectMapper \u003d new ObjectMapper().findAndRegisterModules()","lastModifiedDate":"2016-10-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)","lastModifiedDate":"2016-10-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)","lastModifiedDate":"2016-10-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":" .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)","lastModifiedDate":"2016-10-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)","lastModifiedDate":"2016-10-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .registerModule(new SimpleModule(\"SimpleModule\")","lastModifiedDate":"2016-10-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .addSerializer(Level.class, new ToStringSerializer())","lastModifiedDate":"2016-10-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .addDeserializer(Level.class, new LevelDeserializer(Level.class)));","lastModifiedDate":"2016-10-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" static \u003cT\u003e void serializeObjectToJsonFile(Path jsonFile, T objectToSerialize) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(jsonFile, toJsonString(objectToSerialize));","lastModifiedDate":"2016-10-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" static \u003cT\u003e T deserializeObjectFromJsonFile(Path jsonFile, Class\u003cT\u003e classOfObjectToDeserialize)","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return fromJsonString(FileUtil.readFromFile(jsonFile), classOfObjectToDeserialize);","lastModifiedDate":"2016-10-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns the JSON object from the given file or {@code Optional.empty()} object if the file is not found.","lastModifiedDate":"2023-06-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * If any values are missing from the file, default values will be used, as long as the file is a valid JSON file.","lastModifiedDate":"2023-06-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * @param filePath cannot be null.","lastModifiedDate":"2016-10-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @param classOfObjectToDeserialize JSON file has to correspond to the structure in the class given here.","lastModifiedDate":"2023-06-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading of the JSON file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Optional\u003cT\u003e readJsonFile(","lastModifiedDate":"2016-10-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Path filePath, Class\u003cT\u003e classOfObjectToDeserialize) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!Files.exists(filePath)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2016-10-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.info(\"JSON file \" + filePath + \" found.\");","lastModifiedDate":"2023-01-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" T jsonFile;","lastModifiedDate":"2016-10-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-10-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":" jsonFile \u003d deserializeObjectFromJsonFile(filePath, classOfObjectToDeserialize);","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-10-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" logger.warning(\"Error reading from jsonFile file \" + filePath + \": \" + e);","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new DataLoadingException(e);","lastModifiedDate":"2023-06-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Optional.of(jsonFile);","lastModifiedDate":"2016-10-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Saves the Json object to the specified file.","lastModifiedDate":"2016-10-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * Overwrites existing file if it exists, creates a new file if it doesn\u0027t.","lastModifiedDate":"2016-10-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param jsonFile cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param filePath cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @throws IOException if there was an error during writing to the file","lastModifiedDate":"2016-10-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public static \u003cT\u003e void saveJsonFile(T jsonFile, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" requireNonNull(jsonFile);","lastModifiedDate":"2017-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" serializeObjectToJsonFile(filePath, jsonFile);","lastModifiedDate":"2018-04-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Converts a given string representation of a JSON data to instance of a class","lastModifiedDate":"2016-10-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * @return The instance of T with the specified values in the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public static \u003cT\u003e T fromJsonString(String json, Class\u003cT\u003e instanceClass) throws IOException {","lastModifiedDate":"2016-10-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return objectMapper.readValue(json, instanceClass);","lastModifiedDate":"2016-10-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Converts a given instance of a class into its JSON data string representation","lastModifiedDate":"2016-10-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @param instance The T object to be converted into the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @return JSON data representation of the given class instance, in string","lastModifiedDate":"2016-10-19"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static \u003cT\u003e String toJsonString(T instance) throws JsonProcessingException {","lastModifiedDate":"2016-10-19"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(instance);","lastModifiedDate":"2016-10-19"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Contains methods that retrieve logging level from serialized string.","lastModifiedDate":"2017-08-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private static class LevelDeserializer extends FromStringDeserializer\u003cLevel\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" protected LevelDeserializer(Class\u003c?\u003e vc) {","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" super(vc);","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" protected Level _deserialize(String value, DeserializationContext ctxt) {","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return getLoggingLevel(value);","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Gets the logging level that matches loggingLevelString","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * \u003cp\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Returns null if there are no matches","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private Level getLoggingLevel(String loggingLevelString) {","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return Level.parse(loggingLevelString);","lastModifiedDate":"2016-09-09"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public Class\u003cLevel\u003e handledType() {","lastModifiedDate":"2016-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return Level.class;","lastModifiedDate":"2016-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":3,"-":141}},{"path":"src/main/java/staffconnect/commons/util/StringUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.PrintWriter;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.StringWriter;","lastModifiedDate":"2016-09-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Helper functions for handling strings.","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class StringUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Returns true if the {@code sentence} contains the {@code word}.","lastModifiedDate":"2016-10-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Ignores case, but a full word match is required.","lastModifiedDate":"2016-10-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * \u003cbr\u003eexamples:\u003cpre\u003e","lastModifiedDate":"2016-10-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"abc\") \u003d\u003d true","lastModifiedDate":"2016-10-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"DEF\") \u003d\u003d true","lastModifiedDate":"2016-10-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"AB\") \u003d\u003d false //not a full word match","lastModifiedDate":"2016-10-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * \u003c/pre\u003e","lastModifiedDate":"2016-10-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param sentence cannot be null","lastModifiedDate":"2016-10-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @param word cannot be null, cannot be empty, must be a single word","lastModifiedDate":"2016-10-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static boolean containsWordIgnoreCase(String sentence, String word) {","lastModifiedDate":"2016-10-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" requireNonNull(sentence);","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(word);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" String preppedWord \u003d word.trim();","lastModifiedDate":"2016-10-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" checkArgument(!preppedWord.isEmpty(), \"Word parameter cannot be empty\");","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" checkArgument(preppedWord.split(\"\\\\s+\").length \u003d\u003d 1, \"Word parameter should be a single word\");","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String preppedSentence \u003d sentence;","lastModifiedDate":"2016-10-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" String[] wordsInPreppedSentence \u003d preppedSentence.split(\"\\\\s+\");","lastModifiedDate":"2016-10-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return Arrays.stream(wordsInPreppedSentence)","lastModifiedDate":"2018-01-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .anyMatch(preppedWord::equalsIgnoreCase);","lastModifiedDate":"2018-01-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Returns a detailed message of the t, including the stack trace.","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static String getDetails(Throwable t) {","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(t);","lastModifiedDate":"2017-05-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" StringWriter sw \u003d new StringWriter();","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" t.printStackTrace(new PrintWriter(sw));","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return t.getMessage() + \"\\n\" + sw.toString();","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns true if {@code s} represents a non-zero unsigned integer","lastModifiedDate":"2017-06-02"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * e.g. 1, 2, 3, ..., {@code Integer.MAX_VALUE} \u003cbr\u003e","lastModifiedDate":"2017-06-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Will return false for any other non-null string input","lastModifiedDate":"2017-06-02"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * e.g. empty string, \"-1\", \"0\", \"+1\", and \" 2 \" (untrimmed), \"3 0\" (contains whitespace), \"1 a\" (contains letters)","lastModifiedDate":"2017-06-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code s} is null.","lastModifiedDate":"2017-06-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static boolean isNonZeroUnsignedInteger(String s) {","lastModifiedDate":"2017-06-02"},{"lineNumber":59,"author":{"gitId":"-"},"content":" requireNonNull(s);","lastModifiedDate":"2017-06-02"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-06-02"},{"lineNumber":62,"author":{"gitId":"-"},"content":" int value \u003d Integer.parseInt(s);","lastModifiedDate":"2017-06-02"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return value \u003e 0 \u0026\u0026 !s.startsWith(\"+\"); // \"+1\" is successfully parsed by Integer#parseInt(String)","lastModifiedDate":"2017-06-02"},{"lineNumber":64,"author":{"gitId":"-"},"content":" } catch (NumberFormatException nfe) {","lastModifiedDate":"2017-06-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-06-02"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-02"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":2,"-":66}},{"path":"src/main/java/staffconnect/commons/util/ToStringBuilder.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Builds a string representation of an object that is suitable as the return value of {@link Object#toString()}.","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class ToStringBuilder {","lastModifiedDate":"2019-02-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" private static final String OBJECT_PREFIX \u003d \"{\";","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" private static final String OBJECT_SUFFIX \u003d \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" private static final String FIELD_SEPARATOR \u003d \", \";","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" private static final String FIELD_NAME_VALUE_SEPARATOR \u003d \"\u003d\";","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private final StringBuilder stringBuilder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private boolean hasField;","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Constructs a {@code ToStringBuilder} whose formatted output will be prefixed with {@code objectName}.","lastModifiedDate":"2019-02-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public ToStringBuilder(String objectName) {","lastModifiedDate":"2019-02-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" stringBuilder.append(objectName).append(OBJECT_PREFIX);","lastModifiedDate":"2019-02-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code ToStringBuilder} whose formatted output will be prefixed with the","lastModifiedDate":"2019-02-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * canonical class name of {@code object}.","lastModifiedDate":"2019-02-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public ToStringBuilder(Object object) {","lastModifiedDate":"2019-02-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this(object.getClass().getCanonicalName());","lastModifiedDate":"2019-02-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Adds a field name/value pair to the output string.","lastModifiedDate":"2019-02-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @param fieldName The name of the field.","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @param fieldValue The value of the field.","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @return A reference to this {@code ToStringBuilder} object, allowing method calls to be chained.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public ToStringBuilder add(String fieldName, Object fieldValue) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (hasField) {","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" stringBuilder.append(FIELD_SEPARATOR);","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" stringBuilder.append(fieldName).append(FIELD_NAME_VALUE_SEPARATOR).append(fieldValue);","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" hasField \u003d true;","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns the built formatted string representation.","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return stringBuilder.toString() + OBJECT_SUFFIX;","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-23"}],"authorContributionMap":{"tsulim":1,"-":52}},{"path":"src/main/java/staffconnect/logic/Logic.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-09-25"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.CommandResult;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * API of the Logic component","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2016-09-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2016-09-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2016-09-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2017-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Returns the AddressBook.","lastModifiedDate":"2018-12-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-03"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":" * @see Model#getAddressBook()","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-03"},{"lineNumber":31,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook getAddressBook();","lastModifiedDate":"2018-12-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /** Returns an unmodifiable view of the filtered list of persons */","lastModifiedDate":"2017-09-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getFilteredPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Set the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" void setGuiSettings(GuiSettings guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"tsulim":8,"-":42}},{"path":"src/main/java/staffconnect/logic/LogicManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-09-24"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.Command;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.CommandResult;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.AddressBookParser;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.Storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * The main LogicManager of the app.","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class LogicManager implements Logic {","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String FILE_OPS_ERROR_FORMAT \u003d \"Could not save data due to the following error: %s\";","lastModifiedDate":"2023-06-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String FILE_OPS_PERMISSION_ERROR_FORMAT \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \"Could not save data to file %s due to insufficient permissions to write to the file or the folder.\";","lastModifiedDate":"2023-06-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(LogicManager.class);","lastModifiedDate":"2016-09-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private final Model model;","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private final Storage storage;","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private final AddressBookParser addressBookParser;","lastModifiedDate":"2017-07-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Constructs a {@code LogicManager} with the given {@code Model} and {@code Storage}.","lastModifiedDate":"2020-05-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public LogicManager(Model model, Storage storage) {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.model \u003d model;","lastModifiedDate":"2016-09-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.storage \u003d storage;","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" addressBookParser \u003d new AddressBookParser();","lastModifiedDate":"2018-01-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText) throws CommandException, ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2016-09-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2017-07-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2019-01-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" } catch (AccessDeniedException e) {","lastModifiedDate":"2023-06-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" throw new CommandException(String.format(FILE_OPS_PERMISSION_ERROR_FORMAT, e.getMessage()), e);","lastModifiedDate":"2023-06-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2018-12-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" throw new CommandException(String.format(FILE_OPS_ERROR_FORMAT, ioe.getMessage()), ioe);","lastModifiedDate":"2023-06-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2018-12-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return model.getAddressBook();","lastModifiedDate":"2018-12-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-03"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return model.getFilteredPersonList();","lastModifiedDate":"2016-09-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return model.getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return model.getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" model.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"tsulim":12,"-":76}},{"path":"src/main/java/staffconnect/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.Prefix;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":3,"-":48}},{"path":"src/main/java/staffconnect/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":11,"-":73}},{"path":"src/main/java/staffconnect/logic/commands/ClearCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Clears the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class ClearCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"clear\";","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Address book has been cleared!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":" model.setAddressBook(new AddressBook());","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":3,"-":20}},{"path":"src/main/java/staffconnect/logic/commands/Command.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a command with hidden internal logic and the ability to be executed.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public abstract class Command {","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Executes the command and returns the result message.","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * @param model {@code Model} which the command should operate on.","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * @return feedback message of the operation result for display","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public abstract CommandResult execute(Model model) throws CommandException;","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":3,"-":17}},{"path":"src/main/java/staffconnect/logic/commands/CommandResult.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2018-12-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Represents the result of a command execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class CommandResult {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final String feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /** Help information should be shown to the user. */","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private final boolean showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /** The application should exit. */","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final boolean exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified fields.","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser, boolean showHelp, boolean exit) {","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.feedbackToUser \u003d requireNonNull(feedbackToUser);","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.showHelp \u003d showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.exit \u003d exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified {@code feedbackToUser},","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * and other fields set to their default value.","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser) {","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this(feedbackToUser, false, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public String getFeedbackToUser() {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public boolean isShowHelp() {","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean isExit() {","lastModifiedDate":"2018-12-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2018-12-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" if (!(other instanceof CommandResult)) {","lastModifiedDate":"2018-12-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-12-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" CommandResult otherCommandResult \u003d (CommandResult) other;","lastModifiedDate":"2018-12-09"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return feedbackToUser.equals(otherCommandResult.feedbackToUser)","lastModifiedDate":"2018-12-09"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u0026\u0026 showHelp \u003d\u003d otherCommandResult.showHelp","lastModifiedDate":"2018-12-09"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u0026\u0026 exit \u003d\u003d otherCommandResult.exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2018-12-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return Objects.hash(feedbackToUser, showHelp, exit);","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .add(\"feedbackToUser\", feedbackToUser)","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .add(\"showHelp\", showHelp)","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .add(\"exit\", exit)","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":2,"-":80}},{"path":"src/main/java/staffconnect/logic/commands/DeleteCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-09-01"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Deletes a person identified using it\u0027s displayed index from the address book.","lastModifiedDate":"2018-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class DeleteCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"delete\";","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \": Deletes the person identified by the index number used in the displayed person list.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer)\\n\"","lastModifiedDate":"2016-09-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1\";","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_PERSON_SUCCESS \u003d \"Deleted Person: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Index targetIndex;","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public DeleteCommand(Index targetIndex) {","lastModifiedDate":"2017-05-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.targetIndex \u003d targetIndex;","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (targetIndex.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personToDelete \u003d lastShownList.get(targetIndex.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" model.deletePerson(personToDelete);","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(personToDelete)));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (!(other instanceof DeleteCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" DeleteCommand otherDeleteCommand \u003d (DeleteCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return targetIndex.equals(otherDeleteCommand.targetIndex);","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .add(\"targetIndex\", targetIndex)","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":7,"-":62}},{"path":"src/main/java/staffconnect/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":63,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":87,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2017-03-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":134,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":135,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":136,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":137,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":138,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":140,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":144,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":146,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":148,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":149,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":153,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);","lastModifiedDate":"2018-08-14"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":163,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":164,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":167,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":168,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":171,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":172,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":179,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":180,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":181,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":183,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":184,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":187,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":188,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":192,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":193,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":195,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":196,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":197,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":198,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":199,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":200,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":203,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":204,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":205,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":206,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":207,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":208,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":209,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":212,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":213,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":214,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":215,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":219,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":220,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":221,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":223,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":225,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":226,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":227,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":228,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":229,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":242,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"tsulim":19,"-":223}},{"path":"src/main/java/staffconnect/logic/commands/ExitCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Terminates the program.","lastModifiedDate":"2016-09-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class ExitCommand extends Command {","lastModifiedDate":"2016-09-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"exit\";","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EXIT_ACKNOWLEDGEMENT \u003d \"Exiting Address Book as requested ...\";","lastModifiedDate":"2016-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true);","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"tsulim":2,"-":17}},{"path":"src/main/java/staffconnect/logic/commands/FindCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Finds and lists all persons in address book whose name contains any of the argument keywords.","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Keyword matching is case insensitive.","lastModifiedDate":"2018-04-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommand extends Command {","lastModifiedDate":"2016-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"find\";","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Finds all persons whose names contain any of \"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"the specified keywords (case-insensitive) and displays them as a list with index numbers.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"Parameters: KEYWORD [MORE_KEYWORDS]...\\n\"","lastModifiedDate":"2016-09-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" alice bob charlie\";","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final NameContainsKeywordsPredicate predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public FindCommand(NameContainsKeywordsPredicate predicate) {","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.predicate \u003d predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new CommandResult(","lastModifiedDate":"2018-04-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size()));","lastModifiedDate":"2018-04-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof FindCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" FindCommand otherFindCommand \u003d (FindCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return predicate.equals(otherFindCommand.predicate);","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .add(\"predicate\", predicate)","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"tsulim":5,"-":53}},{"path":"src/main/java/staffconnect/logic/commands/HelpCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-31"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Format full help instructions for every command for display.","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class HelpCommand extends Command {","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"help\";","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Shows program usage instructions.\\n\"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD;","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String SHOWING_HELP_MESSAGE \u003d \"Opened help window.\";","lastModifiedDate":"2016-08-31"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" return new CommandResult(SHOWING_HELP_MESSAGE, true, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":2,"-":19}},{"path":"src/main/java/staffconnect/logic/commands/ListCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Lists all persons in the address book to the user.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class ListCommand extends Command {","lastModifiedDate":"2016-09-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"list\";","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Listed all persons\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":3,"-":21}},{"path":"src/main/java/staffconnect/logic/commands/exceptions/CommandException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands.exceptions;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents an error which occurs during execution of a {@link Command}.","lastModifiedDate":"2017-02-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CommandException extends Exception {","lastModifiedDate":"2017-02-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public CommandException(String message) {","lastModifiedDate":"2017-02-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Constructs a new {@code CommandException} with the specified detail {@code message} and {@code cause}.","lastModifiedDate":"2018-08-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public CommandException(String message, Throwable cause) {","lastModifiedDate":"2018-08-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2018-08-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"tsulim":1,"-":16}},{"path":"src/main/java/staffconnect/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.AddCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":36,"author":{"gitId":"-"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2017-12-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Person person \u003d new Person(name, phone, email, address, tagList);","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"tsulim":15,"-":46}},{"path":"src/main/java/staffconnect/logic/parser/AddressBookParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.AddCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.ClearCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.Command;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.ExitCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.FindCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.HelpCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.ListCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses user input.","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookParser {","lastModifiedDate":"2017-07-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Used for initial separation of command word and args.","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Pattern BASIC_COMMAND_FORMAT \u003d Pattern.compile(\"(?\u003ccommandWord\u003e\\\\S+)(?\u003carguments\u003e.*)\");","lastModifiedDate":"2016-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AddressBookParser.class);","lastModifiedDate":"2023-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Parses user input into command for execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param userInput full user input string","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @return the command based on the user input","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" final Matcher matcher \u003d BASIC_COMMAND_FORMAT.matcher(userInput.trim());","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!matcher.matches()) {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Note to developers: Change the log level in config.json to enable lower level (i.e., FINE, FINER and lower)","lastModifiedDate":"2023-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // log messages such as the one below.","lastModifiedDate":"2023-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Lower level log messages are used sparingly to minimize noise in the code.","lastModifiedDate":"2023-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logger.fine(\"Command word: \" + commandWord + \"; Arguments: \" + arguments);","lastModifiedDate":"2023-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" switch (commandWord) {","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" case AddCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return new AddCommandParser().parse(arguments);","lastModifiedDate":"2017-02-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2016-12-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":" case DeleteCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return new DeleteCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" case ClearCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new ClearCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" case FindCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return new FindCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" case ListCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return new ListCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" case ExitCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ExitCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" case HelpCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new HelpCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" default:","lastModifiedDate":"2016-08-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" logger.finer(\"This user input caused a ParseException: \" + userInput);","lastModifiedDate":"2023-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":14,"-":72}},{"path":"src/main/java/staffconnect/logic/parser/ArgumentMultimap.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2017-03-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-03-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2017-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Stores mapping of prefixes to their respective arguments.","lastModifiedDate":"2017-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Each key may be associated with multiple argument values.","lastModifiedDate":"2017-03-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Values for a given key are stored in a list, and the insertion ordering is maintained.","lastModifiedDate":"2017-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Keys are unique, but the list of argument values may contain duplicate argument values, i.e. the same argument value","lastModifiedDate":"2017-03-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * can be inserted multiple times for the same prefix.","lastModifiedDate":"2017-03-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ArgumentMultimap {","lastModifiedDate":"2017-03-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /** Prefixes mapped to their respective arguments**/","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final Map\u003cPrefix, List\u003cString\u003e\u003e argMultimap \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2017-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Associates the specified argument value with {@code prefix} key in this map.","lastModifiedDate":"2017-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * If the map previously contained a mapping for the key, the new value is appended to the list of existing values.","lastModifiedDate":"2017-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @param prefix Prefix key with which the specified argument value is to be associated","lastModifiedDate":"2017-03-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @param argValue Argument value to be associated with the specified prefix key","lastModifiedDate":"2017-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void put(Prefix prefix, String argValue) {","lastModifiedDate":"2017-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" List\u003cString\u003e argValues \u003d getAllValues(prefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" argValues.add(argValue);","lastModifiedDate":"2017-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" argMultimap.put(prefix, argValues);","lastModifiedDate":"2017-03-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2017-03-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() : Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2017-03-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns all values of {@code prefix}.","lastModifiedDate":"2017-03-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * If the prefix does not exist or has no values, this will return an empty list.","lastModifiedDate":"2017-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Modifying the returned list will not affect the underlying data structure of the ArgumentMultimap.","lastModifiedDate":"2017-03-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getAllValues(Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (!argMultimap.containsKey(prefix)) {","lastModifiedDate":"2017-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e();","lastModifiedDate":"2017-03-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(argMultimap.get(prefix));","lastModifiedDate":"2017-03-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Returns the preamble (text before the first valid prefix). Trims any leading/trailing spaces.","lastModifiedDate":"2017-03-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public String getPreamble() {","lastModifiedDate":"2017-03-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return getValue(new Prefix(\"\")).orElse(\"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Throws a {@code ParseException} if any of the prefixes given in {@code prefixes} appeared more than","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * once among the arguments.","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void verifyNoDuplicatePrefixesFor(Prefix... prefixes) throws ParseException {","lastModifiedDate":"2023-07-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Prefix[] duplicatedPrefixes \u003d Stream.of(prefixes).distinct()","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .filter(prefix -\u003e argMultimap.containsKey(prefix) \u0026\u0026 argMultimap.get(prefix).size() \u003e 1)","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" .toArray(Prefix[]::new);","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (duplicatedPrefixes.length \u003e 0) {","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" throw new ParseException(Messages.getErrorMessageForDuplicatePrefixes(duplicatedPrefixes));","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-08"}],"authorContributionMap":{"tsulim":3,"-":75}},{"path":"src/main/java/staffconnect/logic/parser/ArgumentTokenizer.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-01-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-10-16"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Tokenizes arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * e.g. {@code some preamble text t/ 11.00 t/12.00 k/ m/ July} where prefixes are {@code t/ k/ m/}.\u003cbr\u003e","lastModifiedDate":"2017-05-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * 1. An argument\u0027s value can be an empty string e.g. the value of {@code k/} in the above example.\u003cbr\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * 2. Leading and trailing whitespaces of an argument value will be discarded.\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * 3. An argument may be repeated and all its values will be accumulated e.g. the value of {@code t/}","lastModifiedDate":"2017-05-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * in the above example.\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class ArgumentTokenizer {","lastModifiedDate":"2016-10-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap} object that maps prefixes to their","lastModifiedDate":"2017-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * respective argument values. Only the given prefixes will be recognized in the arguments string.","lastModifiedDate":"2017-03-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2017-03-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) {","lastModifiedDate":"2017-03-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" List\u003cPrefixPosition\u003e positions \u003d findAllPrefixPositions(argsString, prefixes);","lastModifiedDate":"2017-03-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return extractArguments(argsString, positions);","lastModifiedDate":"2017-03-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Finds all zero-based prefix positions in the given arguments string.","lastModifiedDate":"2017-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to find in the arguments string","lastModifiedDate":"2017-03-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @return List of zero-based prefix positions in the given arguments string","lastModifiedDate":"2017-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static List\u003cPrefixPosition\u003e findAllPrefixPositions(String argsString, Prefix... prefixes) {","lastModifiedDate":"2017-03-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return Arrays.stream(prefixes)","lastModifiedDate":"2018-01-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .flatMap(prefix -\u003e findPrefixPositions(argsString, prefix).stream())","lastModifiedDate":"2018-01-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-01-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * {@see findAllPrefixPositions}","lastModifiedDate":"2017-03-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private static List\u003cPrefixPosition\u003e findPrefixPositions(String argsString, Prefix prefix) {","lastModifiedDate":"2017-03-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" List\u003cPrefixPosition\u003e positions \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2016-10-16"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" int prefixPosition \u003d findPrefixPosition(argsString, prefix.getPrefix(), 0);","lastModifiedDate":"2017-05-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" while (prefixPosition !\u003d -1) {","lastModifiedDate":"2017-05-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" PrefixPosition extendedPrefix \u003d new PrefixPosition(prefix, prefixPosition);","lastModifiedDate":"2017-05-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" positions.add(extendedPrefix);","lastModifiedDate":"2016-10-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" prefixPosition \u003d findPrefixPosition(argsString, prefix.getPrefix(), prefixPosition);","lastModifiedDate":"2017-05-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return positions;","lastModifiedDate":"2016-10-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Returns the index of the first occurrence of {@code prefix} in","lastModifiedDate":"2017-05-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * {@code argsString} starting from index {@code fromIndex}. An occurrence","lastModifiedDate":"2017-05-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * is valid if there is a whitespace before {@code prefix}. Returns -1 if no","lastModifiedDate":"2017-05-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * such occurrence can be found.","lastModifiedDate":"2017-05-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * E.g if {@code argsString} \u003d \"e/hip/900\", {@code prefix} \u003d \"p/\" and","lastModifiedDate":"2017-05-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * {@code fromIndex} \u003d 0, this method returns -1 as there are no valid","lastModifiedDate":"2017-05-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * occurrences of \"p/\" with whitespace before it. However, if","lastModifiedDate":"2017-05-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * {@code argsString} \u003d \"e/hi p/900\", {@code prefix} \u003d \"p/\" and","lastModifiedDate":"2017-05-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * {@code fromIndex} \u003d 0, this method returns 5.","lastModifiedDate":"2017-05-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static int findPrefixPosition(String argsString, String prefix, int fromIndex) {","lastModifiedDate":"2017-05-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" int prefixIndex \u003d argsString.indexOf(\" \" + prefix, fromIndex);","lastModifiedDate":"2017-05-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return prefixIndex \u003d\u003d -1 ? -1","lastModifiedDate":"2017-05-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" : prefixIndex + 1; // +1 as offset for whitespace","lastModifiedDate":"2017-05-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Extracts prefixes and their argument values, and returns an {@code ArgumentMultimap} object that maps the","lastModifiedDate":"2017-03-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * extracted prefixes to their respective arguments. Prefixes are extracted based on their zero-based positions in","lastModifiedDate":"2017-03-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * {@code argsString}.","lastModifiedDate":"2017-03-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param prefixPositions Zero-based positions of all prefixes in {@code argsString}","lastModifiedDate":"2017-03-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static ArgumentMultimap extractArguments(String argsString, List\u003cPrefixPosition\u003e prefixPositions) {","lastModifiedDate":"2017-03-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // Sort by start position","lastModifiedDate":"2016-10-16"},{"lineNumber":90,"author":{"gitId":"-"},"content":" prefixPositions.sort((prefix1, prefix2) -\u003e prefix1.getStartPosition() - prefix2.getStartPosition());","lastModifiedDate":"2016-10-16"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // Insert a PrefixPosition to represent the preamble","lastModifiedDate":"2016-10-16"},{"lineNumber":93,"author":{"gitId":"-"},"content":" PrefixPosition preambleMarker \u003d new PrefixPosition(new Prefix(\"\"), 0);","lastModifiedDate":"2016-10-16"},{"lineNumber":94,"author":{"gitId":"-"},"content":" prefixPositions.add(0, preambleMarker);","lastModifiedDate":"2016-10-16"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // Add a dummy PrefixPosition to represent the end of the string","lastModifiedDate":"2016-10-16"},{"lineNumber":97,"author":{"gitId":"-"},"content":" PrefixPosition endPositionMarker \u003d new PrefixPosition(new Prefix(\"\"), argsString.length());","lastModifiedDate":"2016-10-16"},{"lineNumber":98,"author":{"gitId":"-"},"content":" prefixPositions.add(endPositionMarker);","lastModifiedDate":"2016-10-16"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // Map prefixes to their argument values (if any)","lastModifiedDate":"2017-03-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d new ArgumentMultimap();","lastModifiedDate":"2017-03-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c prefixPositions.size() - 1; i++) {","lastModifiedDate":"2016-10-16"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // Extract and store prefixes and their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Prefix argPrefix \u003d prefixPositions.get(i).getPrefix();","lastModifiedDate":"2017-03-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String argValue \u003d extractArgumentValue(argsString, prefixPositions.get(i), prefixPositions.get(i + 1));","lastModifiedDate":"2016-10-16"},{"lineNumber":106,"author":{"gitId":"-"},"content":" argMultimap.put(argPrefix, argValue);","lastModifiedDate":"2017-03-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return argMultimap;","lastModifiedDate":"2017-03-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Returns the trimmed value of the argument in the arguments string specified by {@code currentPrefixPosition}.","lastModifiedDate":"2017-03-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * The end position of the value is determined by {@code nextPrefixPosition}.","lastModifiedDate":"2017-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" private static String extractArgumentValue(String argsString,","lastModifiedDate":"2017-03-20"},{"lineNumber":117,"author":{"gitId":"-"},"content":" PrefixPosition currentPrefixPosition,","lastModifiedDate":"2016-10-16"},{"lineNumber":118,"author":{"gitId":"-"},"content":" PrefixPosition nextPrefixPosition) {","lastModifiedDate":"2016-10-16"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Prefix prefix \u003d currentPrefixPosition.getPrefix();","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" int valueStartPos \u003d currentPrefixPosition.getStartPosition() + prefix.getPrefix().length();","lastModifiedDate":"2016-10-16"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String value \u003d argsString.substring(valueStartPos, nextPrefixPosition.getStartPosition());","lastModifiedDate":"2016-10-16"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return value.trim();","lastModifiedDate":"2016-10-16"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":127,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":128,"author":{"gitId":"-"},"content":" * Represents a prefix\u0027s position in an arguments string.","lastModifiedDate":"2017-03-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":130,"author":{"gitId":"-"},"content":" private static class PrefixPosition {","lastModifiedDate":"2017-03-20"},{"lineNumber":131,"author":{"gitId":"-"},"content":" private int startPosition;","lastModifiedDate":"2016-10-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" private final Prefix prefix;","lastModifiedDate":"2016-10-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":134,"author":{"gitId":"-"},"content":" PrefixPosition(Prefix prefix, int startPosition) {","lastModifiedDate":"2016-10-19"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.prefix \u003d prefix;","lastModifiedDate":"2016-10-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" this.startPosition \u003d startPosition;","lastModifiedDate":"2016-10-19"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" int getStartPosition() {","lastModifiedDate":"2016-10-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return startPosition;","lastModifiedDate":"2018-08-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" Prefix getPrefix() {","lastModifiedDate":"2016-10-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return prefix;","lastModifiedDate":"2018-08-14"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-16"}],"authorContributionMap":{"tsulim":1,"-":147}},{"path":"src/main/java/staffconnect/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"tsulim":1,"-":14}},{"path":"src/main/java/staffconnect/logic/parser/DeleteCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new DeleteCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class DeleteCommandParser implements Parser\u003cDeleteCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the DeleteCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * and returns a DeleteCommand object for execution.","lastModifiedDate":"2019-05-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public DeleteCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2017-05-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new DeleteCommand(index);","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"tsulim":5,"-":24}},{"path":"src/main/java/staffconnect/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":42,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":61,"author":{"gitId":"-"},"content":" parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2017-06-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"tsulim":12,"-":73}},{"path":"src/main/java/staffconnect/logic/parser/FindCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.FindCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new FindCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParser implements Parser\u003cFindCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the FindCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * and returns a FindCommand object for execution.","lastModifiedDate":"2019-05-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public FindCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" String trimmedArgs \u003d args.trim();","lastModifiedDate":"2017-02-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" if (trimmedArgs.isEmpty()) {","lastModifiedDate":"2017-02-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-01-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" String[] nameKeywords \u003d trimmedArgs.split(\"\\\\s+\");","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(nameKeywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"tsulim":5,"-":28}},{"path":"src/main/java/staffconnect/logic/parser/Parser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.Command;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Parser that is able to parse user input into a {@code Command} of type {@code T}.","lastModifiedDate":"2017-07-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public interface Parser\u003cT extends Command\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a command and returns it.","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * @throws ParseException if {@code userInput} does not conform the expected format","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" T parse(String userInput) throws ParseException;","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"tsulim":3,"-":13}},{"path":"src/main/java/staffconnect/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.StringUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":33,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":48,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":61,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":76,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":86,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":91,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":106,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":108,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":117,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":118,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":120,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"tsulim":9,"-":115}},{"path":"src/main/java/staffconnect/logic/parser/Prefix.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * A prefix that marks the beginning of an argument in an arguments string.","lastModifiedDate":"2017-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" * E.g. \u0027t/\u0027 in \u0027add James t/ friend\u0027.","lastModifiedDate":"2017-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class Prefix {","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" private final String prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public Prefix(String prefix) {","lastModifiedDate":"2017-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" this.prefix \u003d prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public String getPrefix() {","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" return prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return getPrefix();","lastModifiedDate":"2017-05-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return prefix \u003d\u003d null ? 0 : prefix.hashCode();","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" if (!(other instanceof Prefix)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Prefix otherPrefix \u003d (Prefix) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return prefix.equals(otherPrefix.prefix);","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-11"}],"authorContributionMap":{"tsulim":1,"-":41}},{"path":"src/main/java/staffconnect/logic/parser/exceptions/ParseException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser.exceptions;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Represents a parse error encountered by a parser.","lastModifiedDate":"2017-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class ParseException extends IllegalValueException {","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public ParseException(String message) {","lastModifiedDate":"2017-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2017-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public ParseException(String message, Throwable cause) {","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-11"}],"authorContributionMap":{"tsulim":2,"-":15}},{"path":"src/main/java/staffconnect/model/AddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.UniquePersonList;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Wraps all data at the address-book level","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Duplicates are not allowed (by .isSamePerson comparison)","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class AddressBook implements ReadOnlyAddressBook {","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final UniquePersonList persons;","lastModifiedDate":"2016-08-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * The \u0027unusual\u0027 code block below is a non-static initialization block, sometimes used to avoid duplication","lastModifiedDate":"2019-05-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * between constructors. See https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html","lastModifiedDate":"2016-10-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Note that non-static init blocks are not recommended to use. There are other ways to avoid duplication","lastModifiedDate":"2016-10-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * among constructors.","lastModifiedDate":"2016-10-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" {","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" persons \u003d new UniquePersonList();","lastModifiedDate":"2016-08-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddressBook() {}","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Creates an AddressBook using the Persons in the {@code toBeCopied}","lastModifiedDate":"2018-03-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public AddressBook(ReadOnlyAddressBook toBeCopied) {","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this();","lastModifiedDate":"2016-12-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" resetData(toBeCopied);","lastModifiedDate":"2016-12-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" //// list overwrite operations","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Replaces the contents of the person list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.persons.setPersons(persons);","lastModifiedDate":"2016-10-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Resets the existing data of this {@code AddressBook} with {@code newData}.","lastModifiedDate":"2017-08-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void resetData(ReadOnlyAddressBook newData) {","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" requireNonNull(newData);","lastModifiedDate":"2017-05-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" setPersons(newData.getPersonList());","lastModifiedDate":"2018-03-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" //// person-level operations","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns true if a person with the same identity as {@code person} exists in the address book.","lastModifiedDate":"2018-08-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return persons.contains(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * The person must not already exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void addPerson(Person p) {","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" persons.add(p);","lastModifiedDate":"2018-03-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Replaces the given person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2018-01-10"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * {@code target} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":84,"author":{"gitId":"-"},"content":" requireNonNull(editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" persons.setPerson(target, editedPerson);","lastModifiedDate":"2018-03-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Removes {@code key} from this {@code AddressBook}.","lastModifiedDate":"2017-08-16"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * {@code key} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void removePerson(Person key) {","lastModifiedDate":"2018-08-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":" persons.remove(key);","lastModifiedDate":"2018-02-28"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" //// util methods","lastModifiedDate":"2016-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .add(\"persons\", persons)","lastModifiedDate":"2019-02-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" return persons.asUnmodifiableObservableList();","lastModifiedDate":"2018-04-05"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-01"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-01"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" if (!(other instanceof AddressBook)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" AddressBook otherAddressBook \u003d (AddressBook) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" return persons.equals(otherAddressBook.persons);","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return persons.hashCode();","lastModifiedDate":"2018-03-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":4,"-":126}},{"path":"src/main/java/staffconnect/model/Model.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * The API of the Model component.","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public interface Model {","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /** {@code Predicate} that always evaluate to true */","lastModifiedDate":"2017-08-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":" Predicate\u003cPerson\u003e PREDICATE_SHOW_ALL_PERSONS \u003d unused -\u003e true;","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Replaces user prefs data with the data in {@code userPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" void setUserPrefs(ReadOnlyUserPrefs userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns the user prefs.","lastModifiedDate":"2018-11-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ReadOnlyUserPrefs getUserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Sets the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" void setGuiSettings(GuiSettings guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Sets the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" void setAddressBookFilePath(Path addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Replaces address book data with the data in {@code addressBook}.","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" void setAddressBook(ReadOnlyAddressBook addressBook);","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /** Returns the AddressBook */","lastModifiedDate":"2016-09-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook getAddressBook();","lastModifiedDate":"2016-09-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Returns true if a person with the same identity as {@code person} exists in the address book.","lastModifiedDate":"2018-08-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" boolean hasPerson(Person person);","lastModifiedDate":"2018-08-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Deletes the given person.","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * The person must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" void deletePerson(Person target);","lastModifiedDate":"2018-08-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Adds the given person.","lastModifiedDate":"2018-08-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * {@code person} must not already exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" void addPerson(Person person);","lastModifiedDate":"2018-08-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Replaces the given person {@code target} with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * {@code target} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" void setPerson(Person target, Person editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /** Returns an unmodifiable view of the filtered person list */","lastModifiedDate":"2017-09-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getFilteredPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Updates the filter of the filtered person list to filter by the given {@code predicate}.","lastModifiedDate":"2017-08-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code predicate} is null.","lastModifiedDate":"2017-08-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate);","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"tsulim":3,"-":84}},{"path":"src/main/java/staffconnect/model/ModelManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-08-05"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import javafx.collections.transformation.FilteredList;","lastModifiedDate":"2016-08-26"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Represents the in-memory model of the address book data.","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class ModelManager implements Model {","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(ModelManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final AddressBook addressBook;","lastModifiedDate":"2019-01-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final UserPrefs userPrefs;","lastModifiedDate":"2018-12-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final FilteredList\u003cPerson\u003e filteredPersons;","lastModifiedDate":"2018-01-10"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Initializes a ModelManager with the given addressBook and userPrefs.","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" requireAllNonNull(addressBook, userPrefs);","lastModifiedDate":"2017-05-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" logger.fine(\"Initializing with address book: \" + addressBook + \" and user prefs \" + userPrefs);","lastModifiedDate":"2016-12-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.addressBook \u003d new AddressBook(addressBook);","lastModifiedDate":"2019-01-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.userPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" filteredPersons \u003d new FilteredList\u003c\u003e(this.addressBook.getPersonList());","lastModifiedDate":"2019-01-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public ModelManager() {","lastModifiedDate":"2016-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this(new AddressBook(), new UserPrefs());","lastModifiedDate":"2016-09-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d UserPrefs \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.userPrefs.resetData(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return userPrefs;","lastModifiedDate":"2018-11-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return userPrefs.getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" requireNonNull(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return userPrefs.getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":" requireNonNull(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AddressBook \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2018-11-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook addressBook) {","lastModifiedDate":"2018-11-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.addressBook.resetData(addressBook);","lastModifiedDate":"2019-01-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2016-09-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2019-01-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-15"},{"lineNumber":92,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return addressBook.hasPerson(person);","lastModifiedDate":"2019-01-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-15"},{"lineNumber":98,"author":{"gitId":"-"},"content":" addressBook.removePerson(target);","lastModifiedDate":"2019-01-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-15"},{"lineNumber":103,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2019-01-25"},{"lineNumber":104,"author":{"gitId":"-"},"content":" updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-26"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-26"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":109,"author":{"gitId":"-"},"content":" requireAllNonNull(target, editedPerson);","lastModifiedDate":"2017-06-07"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" addressBook.setPerson(target, editedPerson);","lastModifiedDate":"2019-01-25"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Filtered Person List Accessors \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-10-12"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-19"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * Returns an unmodifiable view of the list of {@code Person} backed by the internal list of","lastModifiedDate":"2018-01-10"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * {@code versionedAddressBook}","lastModifiedDate":"2018-06-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-19"},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return filteredPersons;","lastModifiedDate":"2018-12-09"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":125,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":126,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":127,"author":{"gitId":"-"},"content":" requireNonNull(predicate);","lastModifiedDate":"2017-08-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" filteredPersons.setPredicate(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":" if (!(other instanceof ModelManager)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":139,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" ModelManager otherModelManager \u003d (ModelManager) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":143,"author":{"gitId":"-"},"content":" return addressBook.equals(otherModelManager.addressBook)","lastModifiedDate":"2023-07-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" \u0026\u0026 userPrefs.equals(otherModelManager.userPrefs)","lastModifiedDate":"2023-07-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" \u0026\u0026 filteredPersons.equals(otherModelManager.filteredPersons);","lastModifiedDate":"2023-07-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":5,"-":143}},{"path":"src/main/java/staffconnect/model/ReadOnlyAddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Unmodifiable view of an address book","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public interface ReadOnlyAddressBook {","lastModifiedDate":"2019-01-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Returns an unmodifiable view of the persons list.","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * This list will not contain any duplicate persons.","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":2,"-":15}},{"path":"src/main/java/staffconnect/model/ReadOnlyUserPrefs.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-11-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Unmodifiable view of user prefs.","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public interface ReadOnlyUserPrefs {","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-11-27"}],"authorContributionMap":{"tsulim":2,"-":14}},{"path":"src/main/java/staffconnect/model/UserPrefs.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Represents User\u0027s preferences.","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class UserPrefs implements ReadOnlyUserPrefs {","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private GuiSettings guiSettings \u003d new GuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private Path addressBookFilePath \u003d Paths.get(\"data\" , \"addressbook.json\");","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with default values.","lastModifiedDate":"2018-12-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public UserPrefs() {}","lastModifiedDate":"2018-12-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with the prefs in {@code userPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public UserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this();","lastModifiedDate":"2018-12-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" resetData(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Resets the existing data of this {@code UserPrefs} with {@code newUserPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData(ReadOnlyUserPrefs newUserPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(newUserPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" setGuiSettings(newUserPrefs.getGuiSettings());","lastModifiedDate":"2018-12-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" setAddressBookFilePath(newUserPrefs.getAddressBookFilePath());","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return guiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.guiSettings \u003d guiSettings;","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" requireNonNull(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.addressBookFilePath \u003d addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" if (!(other instanceof UserPrefs)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" UserPrefs otherUserPrefs \u003d (UserPrefs) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return guiSettings.equals(otherUserPrefs.guiSettings)","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u0026\u0026 addressBookFilePath.equals(otherUserPrefs.addressBookFilePath);","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Objects.hash(guiSettings, addressBookFilePath);","lastModifiedDate":"2018-08-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-02-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" sb.append(\"Gui Settings : \" + guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" sb.append(\"\\nLocal data file location : \" + addressBookFilePath);","lastModifiedDate":"2017-02-25"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":2,"-":86}},{"path":"src/main/java/staffconnect/model/person/Address.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s address in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Address {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Addresses can take any values, and it should not be blank\";","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @param address A valid address.","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public Address(String address) {","lastModifiedDate":"2017-05-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" value \u003d address;","lastModifiedDate":"2018-08-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static boolean isValidAddress(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (!(other instanceof Address)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Address otherAddress \u003d (Address) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return value.equals(otherAddress.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":2,"-":63}},{"path":"src/main/java/staffconnect/model/person/Email.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s email in the address book.","lastModifiedDate":"2018-02-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Email {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2021-07-20"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2018-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2018-02-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2021-07-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \"characters.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"2. This is followed by a \u0027@\u0027 and then a domain name. The domain name is made up of domain labels \"","lastModifiedDate":"2021-07-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2021-07-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // alphanumeric and special characters","lastModifiedDate":"2018-02-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2021-07-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2021-07-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2021-07-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String DOMAIN_LAST_PART_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"){2,}$\"; // At least two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Constructs an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":38,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * @param email A valid email address.","lastModifiedDate":"2017-05-30"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Email(String email) {","lastModifiedDate":"2017-05-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":" checkArgument(isValidEmail(email), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":44,"author":{"gitId":"-"},"content":" value \u003d email;","lastModifiedDate":"2018-08-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Returns if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static boolean isValidEmail(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" if (!(other instanceof Email)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Email otherEmail \u003d (Email) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return value.equals(otherEmail.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":2,"-":77}},{"path":"src/main/java/staffconnect/model/person/Name.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s name in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Name {","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2018-04-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public final String fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Constructs a {@code Name}.","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * @param name A valid name.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public Name(String name) {","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" checkArgument(isValidName(name), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" fullName \u003d name;","lastModifiedDate":"2018-08-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid name.","lastModifiedDate":"2018-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static boolean isValidName(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (!(other instanceof Name)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Name otherName \u003d (Name) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return fullName.equals(otherName.fullName);","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return fullName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":2,"-":65}},{"path":"src/main/java/staffconnect/model/person/NameContainsKeywordsPredicate.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.StringUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Tests that a {@code Person}\u0027s {@code Name} matches any of the keywords given.","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicate implements Predicate\u003cPerson\u003e {","lastModifiedDate":"2018-01-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final List\u003cString\u003e keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public NameContainsKeywordsPredicate(List\u003cString\u003e keywords) {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" this.keywords \u003d keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public boolean test(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return keywords.stream()","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" .anyMatch(keyword -\u003e StringUtil.containsWordIgnoreCase(person.getName().fullName, keyword));","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!(other instanceof NameContainsKeywordsPredicate)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate otherNameContainsKeywordsPredicate \u003d (NameContainsKeywordsPredicate) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return keywords.equals(otherNameContainsKeywordsPredicate.keywords);","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"keywords\", keywords).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"tsulim":3,"-":41}},{"path":"src/main/java/staffconnect/model/person/Person.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public Person(Name name, Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2017-05-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":92,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":4,"-":113}},{"path":"src/main/java/staffconnect/model/person/Phone.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s phone number in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Phone {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2018-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \"Phone numbers should only contain numbers, and it should be at least 3 digits long\";","lastModifiedDate":"2018-04-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\d{3,}\";","lastModifiedDate":"2018-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Constructs a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * @param phone A valid phone number.","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public Phone(String phone) {","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" checkArgument(isValidPhone(phone), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" value \u003d phone;","lastModifiedDate":"2018-08-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid phone number.","lastModifiedDate":"2018-04-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static boolean isValidPhone(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (!(other instanceof Phone)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Phone otherPhone \u003d (Phone) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return value.equals(otherPhone.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":2,"-":59}},{"path":"src/main/java/staffconnect/model/person/UniquePersonList.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Iterator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * A list of persons that enforces uniqueness between its elements and does not allow nulls.","lastModifiedDate":"2016-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A person is considered unique by comparing using {@code Person#isSamePerson(Person)}. As such, adding and updating of","lastModifiedDate":"2018-04-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * persons uses Person#isSamePerson(Person) for equality so as to ensure that the person being added or updated is","lastModifiedDate":"2018-04-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * unique in terms of identity in the UniquePersonList. However, the removal of a person uses Person#equals(Object) so","lastModifiedDate":"2018-04-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * as to ensure that the person with exactly the same fields will be removed.","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Supports a minimal set of list operations.","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @see Person#isSamePerson(Person)","lastModifiedDate":"2018-04-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class UniquePersonList implements Iterable\u003cPerson\u003e {","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalList \u003d FXCollections.observableArrayList();","lastModifiedDate":"2016-10-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalUnmodifiableList \u003d","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" FXCollections.unmodifiableObservableList(internalList);","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Returns true if the list contains an equivalent person as the given argument.","lastModifiedDate":"2016-09-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public boolean contains(Person toCheck) {","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" requireNonNull(toCheck);","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return internalList.stream().anyMatch(toCheck::isSamePerson);","lastModifiedDate":"2018-04-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Adds a person to the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * The person must not already exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void add(Person toAdd) {","lastModifiedDate":"2018-08-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" requireNonNull(toAdd);","lastModifiedDate":"2017-05-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (contains(toAdd)) {","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" internalList.add(toAdd);","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Replaces the person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * {@code target} must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" requireAllNonNull(target, editedPerson);","lastModifiedDate":"2018-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" int index \u003d internalList.indexOf(target);","lastModifiedDate":"2017-06-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" if (index \u003d\u003d -1) {","lastModifiedDate":"2017-06-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2017-06-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" if (!target.isSamePerson(editedPerson) \u0026\u0026 contains(editedPerson)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-12-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" internalList.set(index, editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Removes the equivalent person from the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * The person must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void remove(Person toRemove) {","lastModifiedDate":"2018-08-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" requireNonNull(toRemove);","lastModifiedDate":"2017-05-15"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (!internalList.remove(toRemove)) {","lastModifiedDate":"2018-02-28"},{"lineNumber":78,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void setPersons(UniquePersonList replacement) {","lastModifiedDate":"2016-10-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" requireNonNull(replacement);","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" internalList.setAll(replacement.internalList);","lastModifiedDate":"2018-08-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Replaces the contents of this list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" requireAllNonNull(persons);","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" if (!personsAreUnique(persons)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2018-01-21"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-21"},{"lineNumber":97,"author":{"gitId":"-"},"content":" internalList.setAll(persons);","lastModifiedDate":"2018-08-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-09-01"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * Returns the backing list as an unmodifiable {@code ObservableList}.","lastModifiedDate":"2017-09-01"},{"lineNumber":102,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-09-01"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e asUnmodifiableObservableList() {","lastModifiedDate":"2018-04-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return internalUnmodifiableList;","lastModifiedDate":"2018-12-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public Iterator\u003cPerson\u003e iterator() {","lastModifiedDate":"2016-08-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return internalList.iterator();","lastModifiedDate":"2016-08-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (!(other instanceof UniquePersonList)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" UniquePersonList otherUniquePersonList \u003d (UniquePersonList) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return internalList.equals(otherUniquePersonList.internalList);","lastModifiedDate":"2023-07-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":129,"author":{"gitId":"-"},"content":" return internalList.hashCode();","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-24"},{"lineNumber":134,"author":{"gitId":"-"},"content":" return internalList.toString();","lastModifiedDate":"2019-02-24"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Returns true if {@code persons} contains only unique persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" private boolean personsAreUnique(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-04-19"},{"lineNumber":141,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c persons.size() - 1; i++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":" for (int j \u003d i + 1; j \u003c persons.size(); j++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" if (persons.get(i).isSamePerson(persons.get(j))) {","lastModifiedDate":"2018-04-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-19"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":150,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":4,"-":146}},{"path":"src/main/java/staffconnect/model/person/exceptions/DuplicatePersonException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person.exceptions;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that the operation will result in duplicate Persons (Persons are considered duplicates if they have the same","lastModifiedDate":"2018-04-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":" * identity).","lastModifiedDate":"2018-04-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class DuplicatePersonException extends RuntimeException {","lastModifiedDate":"2018-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" public DuplicatePersonException() {","lastModifiedDate":"2017-06-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" super(\"Operation would result in duplicate persons\");","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"tsulim":1,"-":10}},{"path":"src/main/java/staffconnect/model/person/exceptions/PersonNotFoundException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person.exceptions;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that the operation is unable to find the specified person.","lastModifiedDate":"2017-06-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class PersonNotFoundException extends RuntimeException {}","lastModifiedDate":"2018-08-07"}],"authorContributionMap":{"tsulim":1,"-":5}},{"path":"src/main/java/staffconnect/model/tag/Tag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Tag in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Tag {","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Tags names should be alphanumeric\";","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\p{Alnum}+\";","lastModifiedDate":"2018-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public final String tagName;","lastModifiedDate":"2016-10-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Constructs a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * @param tagName A valid tag name.","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public Tag(String tagName) {","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" requireNonNull(tagName);","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" checkArgument(isValidTagName(tagName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid tag name.","lastModifiedDate":"2016-09-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static boolean isValidTagName(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!(other instanceof Tag)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Tag otherTag \u003d (Tag) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return tagName.equals(otherTag.tagName);","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return tagName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Format state as text for viewing.","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return \u0027[\u0027 + tagName + \u0027]\u0027;","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"tsulim":2,"-":60}},{"path":"src/main/java/staffconnect/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":40,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"tsulim":9,"-":51}},{"path":"src/main/java/staffconnect/storage/AddressBookStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":" * Represents a storage for {@link staffconnect.model.AddressBook}.","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public interface AddressBookStorage {","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Returns the file path of the data file.","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Returns AddressBook data as a {@link ReadOnlyAddressBook}.","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns {@code Optional.empty()} if storage file is not found.","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @see #getAddressBookFilePath()","lastModifiedDate":"2016-10-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Saves the given {@link ReadOnlyAddressBook} to the storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @param addressBook cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @throws IOException if there was any problem writing to the file.","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;","lastModifiedDate":"2016-09-28"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * @see #saveAddressBook(ReadOnlyAddressBook)","lastModifiedDate":"2016-10-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException;","lastModifiedDate":"2018-04-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"tsulim":4,"-":41}},{"path":"src/main/java/staffconnect/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2023-05-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"tsulim":8,"-":101}},{"path":"src/main/java/staffconnect/storage/JsonAdaptedTag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Tag}.","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"class JsonAdaptedTag {","lastModifiedDate":"2018-12-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final String tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedTag} with the given {@code tagName}.","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public JsonAdaptedTag(String tagName) {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Converts a given {@code Tag} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public JsonAdaptedTag(Tag source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" tagName \u003d source.tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @JsonValue","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public String getTagName() {","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted tag object into the model\u0027s {@code Tag} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted tag.","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Tag toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(tagName)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new Tag(tagName);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"tsulim":3,"-":45}},{"path":"src/main/java/staffconnect/storage/JsonAddressBookStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.FileUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.JsonUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A class to access AddressBook data stored as a json file on the hard disk.","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorage implements AddressBookStorage {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonAddressBookStorage.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Path filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public JsonAddressBookStorage(Path filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return readAddressBook(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Similar to {@link #readAddressBook()}.","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Optional\u003cJsonSerializableAddressBook\u003e jsonAddressBook \u003d JsonUtil.readJsonFile(","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" filePath, JsonSerializableAddressBook.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!jsonAddressBook.isPresent()) {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Optional.of(jsonAddressBook.get().toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" logger.info(\"Illegal values found in \" + filePath + \": \" + ive.getMessage());","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" throw new DataLoadingException(ive);","lastModifiedDate":"2023-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Similar to {@link #saveAddressBook(ReadOnlyAddressBook)}.","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" requireNonNull(addressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" FileUtil.createIfMissing(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(new JsonSerializableAddressBook(addressBook), filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"tsulim":7,"-":73}},{"path":"src/main/java/staffconnect/storage/JsonSerializableAddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonRootName;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * An Immutable AddressBook that is serializable to JSON format.","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"@JsonRootName(value \u003d \"addressbook\")","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"class JsonSerializableAddressBook {","lastModifiedDate":"2018-12-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"Persons list contains duplicate person(s).\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedPerson\u003e persons \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonSerializableAddressBook} with the given persons.","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(@JsonProperty(\"persons\") List\u003cJsonAdaptedPerson\u003e persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.persons.addAll(persons);","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created {@code JsonSerializableAddressBook}.","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" persons.addAll(source.getPersonList().stream().map(JsonAdaptedPerson::new).collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Converts this address book into the model\u0027s {@code AddressBook} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated.","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public AddressBook toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" for (JsonAdaptedPerson jsonAdaptedPerson : persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Person person \u003d jsonAdaptedPerson.toModelType();","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (addressBook.hasPerson(person)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"tsulim":5,"-":55}},{"path":"src/main/java/staffconnect/storage/JsonUserPrefsStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.JsonUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * A class to access UserPrefs stored in the hard disk as a json file","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class JsonUserPrefsStorage implements UserPrefsStorage {","lastModifiedDate":"2016-10-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private Path filePath;","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public JsonUserPrefsStorage(Path filePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-02-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2017-02-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return readUserPrefs(filePath);","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Similar to {@link #readUserPrefs()}","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @param prefsFilePath location of the data. Cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if the file format is not as expected.","lastModifiedDate":"2023-06-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs(Path prefsFilePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return JsonUtil.readJsonFile(prefsFilePath, UserPrefs.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException {","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(userPrefs, filePath);","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"tsulim":5,"-":42}},{"path":"src/main/java/staffconnect/storage/Storage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * API of the Storage component","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public interface Storage extends AddressBookStorage, UserPrefsStorage {","lastModifiedDate":"2016-09-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException;","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;","lastModifiedDate":"2016-09-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"tsulim":5,"-":27}},{"path":"src/main/java/staffconnect/storage/StorageManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Manages storage of AddressBook data in local storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class StorageManager implements Storage {","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(StorageManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private AddressBookStorage addressBookStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private UserPrefsStorage userPrefsStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates a {@code StorageManager} with the given {@code AddressBookStorage} and {@code UserPrefStorage}.","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public StorageManager(AddressBookStorage addressBookStorage, UserPrefsStorage userPrefsStorage) {","lastModifiedDate":"2016-10-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.addressBookStorage \u003d addressBookStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.userPrefsStorage \u003d userPrefsStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d UserPrefs methods \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-02-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return userPrefsStorage.getUserPrefsFilePath();","lastModifiedDate":"2017-02-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return userPrefsStorage.readUserPrefs();","lastModifiedDate":"2016-10-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException {","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" userPrefsStorage.saveUserPrefs(userPrefs);","lastModifiedDate":"2016-10-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AddressBook methods \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return addressBookStorage.getAddressBookFilePath();","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return readAddressBook(addressBookStorage.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-01"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" logger.fine(\"Attempting to read data from file: \" + filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return addressBookStorage.readAddressBook(filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, addressBookStorage.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-01"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" logger.fine(\"Attempting to write to data file: \" + filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":75,"author":{"gitId":"-"},"content":" addressBookStorage.saveAddressBook(addressBook, filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":6,"-":72}},{"path":"src/main/java/staffconnect/storage/UserPrefsStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":" * Represents a storage for {@link staffconnect.model.UserPrefs}.","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public interface UserPrefsStorage {","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Returns the file path of the UserPrefs data file.","lastModifiedDate":"2017-02-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Path getUserPrefsFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns UserPrefs data from storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns {@code Optional.empty()} if storage file is not found.","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if the loading of data from preference file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":" * Saves the given {@link ReadOnlyUserPrefs} to the storage.","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * @param userPrefs cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @throws IOException if there was any problem writing to the file.","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException;","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"tsulim":6,"-":30}},{"path":"src/main/java/staffconnect/ui/CommandBox.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextField;","lastModifiedDate":"2016-09-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.CommandResult;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * The UI component that is responsible for receiving user command inputs.","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class CommandBox extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String ERROR_STYLE_CLASS \u003d \"error\";","lastModifiedDate":"2017-02-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"CommandBox.fxml\";","lastModifiedDate":"2017-04-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private final CommandExecutor commandExecutor;","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private TextField commandTextField;","lastModifiedDate":"2016-09-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Creates a {@code CommandBox} with the given {@code CommandExecutor}.","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public CommandBox(CommandExecutor commandExecutor) {","lastModifiedDate":"2019-01-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.commandExecutor \u003d commandExecutor;","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // calls #setStyleToDefault() whenever there is a change to the text of the command box.","lastModifiedDate":"2017-06-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":" commandTextField.textProperty().addListener((unused1, unused2, unused3) -\u003e setStyleToDefault());","lastModifiedDate":"2017-06-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Handles the Enter button pressed event.","lastModifiedDate":"2017-08-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private void handleCommandEntered() {","lastModifiedDate":"2018-04-01"},{"lineNumber":39,"author":{"gitId":"-"},"content":" String commandText \u003d commandTextField.getText();","lastModifiedDate":"2020-12-04"},{"lineNumber":40,"author":{"gitId":"-"},"content":" if (commandText.equals(\"\")) {","lastModifiedDate":"2020-12-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2020-12-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-12-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-12-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-02-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" commandExecutor.execute(commandText);","lastModifiedDate":"2020-12-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" commandTextField.setText(\"\");","lastModifiedDate":"2016-09-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" } catch (CommandException | ParseException e) {","lastModifiedDate":"2017-03-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" setStyleToIndicateCommandFailure();","lastModifiedDate":"2017-02-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Sets the command box style to use the default style.","lastModifiedDate":"2017-06-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private void setStyleToDefault() {","lastModifiedDate":"2017-06-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":" commandTextField.getStyleClass().remove(ERROR_STYLE_CLASS);","lastModifiedDate":"2017-02-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Sets the command box style to indicate a failed command.","lastModifiedDate":"2017-02-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private void setStyleToIndicateCommandFailure() {","lastModifiedDate":"2017-02-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" ObservableList\u003cString\u003e styleClass \u003d commandTextField.getStyleClass();","lastModifiedDate":"2017-03-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (styleClass.contains(ERROR_STYLE_CLASS)) {","lastModifiedDate":"2017-03-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2017-03-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" styleClass.add(ERROR_STYLE_CLASS);","lastModifiedDate":"2017-03-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Represents a function that can execute commands.","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @FunctionalInterface","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public interface CommandExecutor {","lastModifiedDate":"2018-12-09"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-09"},{"lineNumber":80,"author":{"gitId":"tsulim"},"content":" * @see Logic#execute(String)","lastModifiedDate":"2024-03-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2018-12-09"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-14"}],"authorContributionMap":{"tsulim":5,"-":80}},{"path":"src/main/java/staffconnect/ui/HelpWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-12-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Button;","lastModifiedDate":"2019-08-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2019-08-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.input.Clipboard;","lastModifiedDate":"2019-08-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.input.ClipboardContent;","lastModifiedDate":"2019-08-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Controller for a help page","lastModifiedDate":"2016-08-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class HelpWindow extends UiPart\u003cStage\u003e {","lastModifiedDate":"2017-12-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String USERGUIDE_URL \u003d \"https://se-education.org/addressbook-level3/UserGuide.html\";","lastModifiedDate":"2019-08-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String HELP_MESSAGE \u003d \"Refer to the user guide: \" + USERGUIDE_URL;","lastModifiedDate":"2019-08-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(HelpWindow.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"HelpWindow.fxml\";","lastModifiedDate":"2016-09-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Button copyButton;","lastModifiedDate":"2019-08-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-08-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2019-08-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Label helpMessage;","lastModifiedDate":"2019-08-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-12-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Creates a new HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-12-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @param root Stage to use as the root of the HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-12-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public HelpWindow(Stage root) {","lastModifiedDate":"2017-12-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":" super(FXML, root);","lastModifiedDate":"2017-12-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":" helpMessage.setText(HELP_MESSAGE);","lastModifiedDate":"2019-08-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-12-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Creates a new HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-12-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public HelpWindow() {","lastModifiedDate":"2017-12-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this(new Stage());","lastModifiedDate":"2017-12-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-01"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Shows the help window.","lastModifiedDate":"2017-08-16"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * @throws IllegalStateException","lastModifiedDate":"2017-08-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * \u003cul\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * if this method is called on a thread other than the JavaFX Application Thread.","lastModifiedDate":"2017-08-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * if this method is called during animation or layout processing.","lastModifiedDate":"2017-08-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * if this method is called on the primary stage.","lastModifiedDate":"2017-08-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * if {@code dialogStage} is already showing.","lastModifiedDate":"2017-08-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * \u003c/ul\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void show() {","lastModifiedDate":"2016-08-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.fine(\"Showing help page about the application.\");","lastModifiedDate":"2016-12-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" getRoot().show();","lastModifiedDate":"2018-02-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" getRoot().centerOnScreen();","lastModifiedDate":"2019-08-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-15"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Returns true if the help window is currently being shown.","lastModifiedDate":"2018-03-15"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-15"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public boolean isShowing() {","lastModifiedDate":"2018-03-15"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return getRoot().isShowing();","lastModifiedDate":"2018-03-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Hides the help window.","lastModifiedDate":"2018-12-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hide() {","lastModifiedDate":"2018-12-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" getRoot().hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Focuses on the help window.","lastModifiedDate":"2018-03-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void focus() {","lastModifiedDate":"2018-03-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" getRoot().requestFocus();","lastModifiedDate":"2018-03-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-08-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-08-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Copies the URL to the user guide to the clipboard.","lastModifiedDate":"2019-08-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-08-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2019-08-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private void copyUrl() {","lastModifiedDate":"2019-08-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" final Clipboard clipboard \u003d Clipboard.getSystemClipboard();","lastModifiedDate":"2019-08-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" final ClipboardContent url \u003d new ClipboardContent();","lastModifiedDate":"2019-08-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" url.putString(USERGUIDE_URL);","lastModifiedDate":"2019-08-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" clipboard.setContent(url);","lastModifiedDate":"2019-08-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-08-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"tsulim":2,"-":100}},{"path":"src/main/java/staffconnect/ui/MainWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-06-16"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.event.ActionEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.MenuItem;","lastModifiedDate":"2016-08-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextInputControl;","lastModifiedDate":"2016-12-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyCombination;","lastModifiedDate":"2016-08-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import javafx.scene.layout.StackPane;","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Logic;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.CommandResult;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * The Main Window. Provides the basic application layout containing","lastModifiedDate":"2016-08-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * a menu bar and space where other JavaFX elements can be placed.","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class MainWindow extends UiPart\u003cStage\u003e {","lastModifiedDate":"2017-11-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"MainWindow.fxml\";","lastModifiedDate":"2016-08-18"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(getClass());","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Stage primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // Independent Ui parts residing in this Ui container","lastModifiedDate":"2016-08-18"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private PersonListPanel personListPanel;","lastModifiedDate":"2016-08-18"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private ResultDisplay resultDisplay;","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private HelpWindow helpWindow;","lastModifiedDate":"2018-03-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private StackPane commandBoxPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private MenuItem helpMenuItem;","lastModifiedDate":"2016-08-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private StackPane personListPanelPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private StackPane resultDisplayPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private StackPane statusbarPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Creates a {@code MainWindow} with the given {@code Stage} and {@code Logic}.","lastModifiedDate":"2020-05-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public MainWindow(Stage primaryStage, Logic logic) {","lastModifiedDate":"2018-12-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" super(FXML, primaryStage);","lastModifiedDate":"2017-11-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // Set dependencies","lastModifiedDate":"2016-09-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.primaryStage \u003d primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.logic \u003d logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // Configure the UI","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" setWindowDefaultSize(logic.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" setAccelerators();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" helpWindow \u003d new HelpWindow();","lastModifiedDate":"2018-03-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public Stage getPrimaryStage() {","lastModifiedDate":"2016-12-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return primaryStage;","lastModifiedDate":"2016-12-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private void setAccelerators() {","lastModifiedDate":"2016-09-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" setAccelerator(helpMenuItem, KeyCombination.valueOf(\"F1\"));","lastModifiedDate":"2016-12-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-18"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * Sets the accelerator of a MenuItem.","lastModifiedDate":"2016-12-18"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @param keyCombination the KeyCombination value of the accelerator","lastModifiedDate":"2016-12-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private void setAccelerator(MenuItem menuItem, KeyCombination keyCombination) {","lastModifiedDate":"2016-12-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":" menuItem.setAccelerator(keyCombination);","lastModifiedDate":"2016-12-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-12-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * TODO: the code below can be removed once the bug reported here","lastModifiedDate":"2016-12-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * https://bugs.openjdk.java.net/browse/JDK-8131666","lastModifiedDate":"2016-12-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * is fixed in later version of SDK.","lastModifiedDate":"2016-12-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * According to the bug report, TextInputControl (TextField, TextArea) will","lastModifiedDate":"2016-12-18"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * consume function-key events. Because CommandBox contains a TextField, and","lastModifiedDate":"2016-12-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * ResultDisplay contains a TextArea, thus some accelerators (e.g F1) will","lastModifiedDate":"2016-12-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * not work when the focus is in them because the key event is consumed by","lastModifiedDate":"2016-12-18"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * the TextInputControl(s).","lastModifiedDate":"2016-12-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * For now, we add following event filter to capture such key events and open","lastModifiedDate":"2016-12-18"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * help window purposely so to support accelerators even when focus is","lastModifiedDate":"2016-12-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * in CommandBox or ResultDisplay.","lastModifiedDate":"2016-12-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" getRoot().addEventFilter(KeyEvent.KEY_PRESSED, event -\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (event.getTarget() instanceof TextInputControl \u0026\u0026 keyCombination.match(event)) {","lastModifiedDate":"2016-12-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" menuItem.getOnAction().handle(new ActionEvent());","lastModifiedDate":"2016-12-18"},{"lineNumber":104,"author":{"gitId":"-"},"content":" event.consume();","lastModifiedDate":"2016-12-18"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":106,"author":{"gitId":"-"},"content":" });","lastModifiedDate":"2016-12-18"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Fills up all the placeholders of this window.","lastModifiedDate":"2017-08-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" void fillInnerParts() {","lastModifiedDate":"2016-09-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" personListPanel \u003d new PersonListPanel(logic.getFilteredPersonList());","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" personListPanelPlaceholder.getChildren().add(personListPanel.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" resultDisplay \u003d new ResultDisplay();","lastModifiedDate":"2018-12-09"},{"lineNumber":117,"author":{"gitId":"-"},"content":" resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" StatusBarFooter statusBarFooter \u003d new StatusBarFooter(logic.getAddressBookFilePath());","lastModifiedDate":"2019-01-25"},{"lineNumber":120,"author":{"gitId":"-"},"content":" statusbarPlaceholder.getChildren().add(statusBarFooter.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" CommandBox commandBox \u003d new CommandBox(this::executeCommand);","lastModifiedDate":"2019-01-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" commandBoxPlaceholder.getChildren().add(commandBox.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":127,"author":{"gitId":"-"},"content":" * Sets the default size based on {@code guiSettings}.","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":129,"author":{"gitId":"-"},"content":" private void setWindowDefaultSize(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":130,"author":{"gitId":"-"},"content":" primaryStage.setHeight(guiSettings.getWindowHeight());","lastModifiedDate":"2018-11-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" primaryStage.setWidth(guiSettings.getWindowWidth());","lastModifiedDate":"2018-11-27"},{"lineNumber":132,"author":{"gitId":"-"},"content":" if (guiSettings.getWindowCoordinates() !\u003d null) {","lastModifiedDate":"2018-11-27"},{"lineNumber":133,"author":{"gitId":"-"},"content":" primaryStage.setX(guiSettings.getWindowCoordinates().getX());","lastModifiedDate":"2018-11-27"},{"lineNumber":134,"author":{"gitId":"-"},"content":" primaryStage.setY(guiSettings.getWindowCoordinates().getY());","lastModifiedDate":"2018-11-27"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":138,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * Opens the help window or focuses on it if it\u0027s already opened.","lastModifiedDate":"2018-03-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":142,"author":{"gitId":"-"},"content":" public void handleHelp() {","lastModifiedDate":"2016-08-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":" if (!helpWindow.isShowing()) {","lastModifiedDate":"2018-03-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" helpWindow.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" helpWindow.focus();","lastModifiedDate":"2018-03-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":150,"author":{"gitId":"-"},"content":" void show() {","lastModifiedDate":"2016-10-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" primaryStage.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":152,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":154,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":155,"author":{"gitId":"-"},"content":" * Closes the application.","lastModifiedDate":"2016-08-18"},{"lineNumber":156,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":157,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":158,"author":{"gitId":"-"},"content":" private void handleExit() {","lastModifiedDate":"2016-08-18"},{"lineNumber":159,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(primaryStage.getWidth(), primaryStage.getHeight(),","lastModifiedDate":"2018-12-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":" (int) primaryStage.getX(), (int) primaryStage.getY());","lastModifiedDate":"2018-12-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" logic.setGuiSettings(guiSettings);","lastModifiedDate":"2018-12-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" helpWindow.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":" primaryStage.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-25"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public PersonListPanel getPersonListPanel() {","lastModifiedDate":"2016-08-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return personListPanel;","lastModifiedDate":"2018-08-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-25"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":170,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2018-12-09"},{"lineNumber":172,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-09"},{"lineNumber":173,"author":{"gitId":"tsulim"},"content":" * @see Logic#execute(String)","lastModifiedDate":"2024-03-10"},{"lineNumber":174,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":" private CommandResult executeCommand(String commandText) throws CommandException, ParseException {","lastModifiedDate":"2018-12-09"},{"lineNumber":176,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-12-09"},{"lineNumber":177,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d logic.execute(commandText);","lastModifiedDate":"2018-12-09"},{"lineNumber":178,"author":{"gitId":"-"},"content":" logger.info(\"Result: \" + commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":179,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":181,"author":{"gitId":"-"},"content":" if (commandResult.isShowHelp()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":182,"author":{"gitId":"-"},"content":" handleHelp();","lastModifiedDate":"2018-12-09"},{"lineNumber":183,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":185,"author":{"gitId":"-"},"content":" if (commandResult.isExit()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":186,"author":{"gitId":"-"},"content":" handleExit();","lastModifiedDate":"2018-12-09"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":190,"author":{"gitId":"-"},"content":" } catch (CommandException | ParseException e) {","lastModifiedDate":"2018-12-09"},{"lineNumber":191,"author":{"gitId":"-"},"content":" logger.info(\"An error occurred while executing command: \" + commandText);","lastModifiedDate":"2023-06-13"},{"lineNumber":192,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(e.getMessage());","lastModifiedDate":"2018-12-09"},{"lineNumber":193,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2018-12-09"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"tsulim":8,"-":188}},{"path":"src/main/java/staffconnect/ui/PersonCard.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Comparator;","lastModifiedDate":"2019-01-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-01-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.FlowPane;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2016-09-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see \u003ca href\u003d\"https://github.com/se-edu/addressbook-level4/issues/336\"\u003eThe issue on AddressBook level 4\u003c/a\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" name.setText(person.getName().fullName);","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" phone.setText(person.getPhone().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":53,"author":{"gitId":"-"},"content":" address.setText(person.getAddress().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" email.setText(person.getEmail().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .sorted(Comparator.comparing(tag -\u003e tag.tagName))","lastModifiedDate":"2019-01-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.tagName)));","lastModifiedDate":"2019-01-02"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"tsulim":2,"-":57}},{"path":"src/main/java/staffconnect/ui/PersonListPanel.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-25"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.ListCell;","lastModifiedDate":"2016-09-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.control.ListView;","lastModifiedDate":"2016-08-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Panel containing the list of persons.","lastModifiedDate":"2016-09-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonListPanel extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListPanel.fxml\";","lastModifiedDate":"2016-09-14"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(PersonListPanel.class);","lastModifiedDate":"2017-04-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private ListView\u003cPerson\u003e personListView;","lastModifiedDate":"2018-02-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates a {@code PersonListPanel} with the given {@code ObservableList}.","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public PersonListPanel(ObservableList\u003cPerson\u003e personList) {","lastModifiedDate":"2019-01-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" personListView.setItems(personList);","lastModifiedDate":"2018-02-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" personListView.setCellFactory(listView -\u003e new PersonListViewCell());","lastModifiedDate":"2016-08-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Custom {@code ListCell} that displays the graphics of a {@code Person} using a {@code PersonCard}.","lastModifiedDate":"2018-02-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" class PersonListViewCell extends ListCell\u003cPerson\u003e {","lastModifiedDate":"2018-02-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" protected void updateItem(Person person, boolean empty) {","lastModifiedDate":"2018-02-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" super.updateItem(person, empty);","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" if (empty || person \u003d\u003d null) {","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" setGraphic(null);","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" setText(null);","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" setGraphic(new PersonCard(person, getIndex() + 1).getRoot());","lastModifiedDate":"2018-02-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"tsulim":3,"-":46}},{"path":"src/main/java/staffconnect/ui/ResultDisplay.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-12-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextArea;","lastModifiedDate":"2016-09-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * A ui for the status bar that is displayed at the header of the application.","lastModifiedDate":"2016-09-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class ResultDisplay extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"ResultDisplay.fxml\";","lastModifiedDate":"2016-09-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-10-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private TextArea resultDisplay;","lastModifiedDate":"2016-10-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public ResultDisplay() {","lastModifiedDate":"2017-06-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"tsulim":1,"-":27}},{"path":"src/main/java/staffconnect/ui/StatusBarFooter.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2018-12-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * A ui for the status bar that is displayed at the footer of the application.","lastModifiedDate":"2016-09-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class StatusBarFooter extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"StatusBarFooter.fxml\";","lastModifiedDate":"2017-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private Label saveLocationStatus;","lastModifiedDate":"2018-12-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Creates a {@code StatusBarFooter} with the given {@code Path}.","lastModifiedDate":"2020-05-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public StatusBarFooter(Path saveLocation) {","lastModifiedDate":"2019-01-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2017-04-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" saveLocationStatus.setText(Paths.get(\".\").resolve(saveLocation).toString());","lastModifiedDate":"2018-12-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":1,"-":27}},{"path":"src/main/java/staffconnect/ui/Ui.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-09-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * API of UI component","lastModifiedDate":"2016-09-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public interface Ui {","lastModifiedDate":"2016-09-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":" /** Starts the UI (and the App). */","lastModifiedDate":"2016-09-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":" void start(Stage primaryStage);","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"tsulim":1,"-":12}},{"path":"src/main/java/staffconnect/ui/UiManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.application.Platform;","lastModifiedDate":"2016-08-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Alert;","lastModifiedDate":"2016-08-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Alert.AlertType;","lastModifiedDate":"2016-08-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.image.Image;","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.MainApp;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.LogsCenter;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.StringUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Logic;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The manager of the UI component.","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class UiManager implements Ui {","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String ALERT_DIALOG_PANE_FIELD_ID \u003d \"alertDialogPane\";","lastModifiedDate":"2017-04-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(UiManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String ICON_APPLICATION \u003d \"/images/address_book_32.png\";","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private MainWindow mainWindow;","lastModifiedDate":"2016-08-18"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Creates a {@code UiManager} with the given {@code Logic}.","lastModifiedDate":"2020-05-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public UiManager(Logic logic) {","lastModifiedDate":"2018-12-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.logic \u003d logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void start(Stage primaryStage) {","lastModifiedDate":"2016-09-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" logger.info(\"Starting UI...\");","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":" //Set the application icon.","lastModifiedDate":"2016-08-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":" primaryStage.getIcons().add(getImage(ICON_APPLICATION));","lastModifiedDate":"2016-08-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":42,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-08-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":" mainWindow \u003d new MainWindow(primaryStage, logic);","lastModifiedDate":"2018-12-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" mainWindow.show(); //This should be called before creating other UI parts","lastModifiedDate":"2016-08-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" mainWindow.fillInnerParts();","lastModifiedDate":"2016-08-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" } catch (Throwable e) {","lastModifiedDate":"2016-08-18"},{"lineNumber":48,"author":{"gitId":"-"},"content":" logger.severe(StringUtil.getDetails(e));","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" showFatalErrorDialogAndShutdown(\"Fatal error during initializing\", e);","lastModifiedDate":"2016-08-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private Image getImage(String imagePath) {","lastModifiedDate":"2016-08-18"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new Image(MainApp.class.getResourceAsStream(imagePath));","lastModifiedDate":"2016-08-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" void showAlertDialogAndWait(Alert.AlertType type, String title, String headerText, String contentText) {","lastModifiedDate":"2016-09-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" showAlertDialogAndWait(mainWindow.getPrimaryStage(), type, title, headerText, contentText);","lastModifiedDate":"2016-08-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Shows an alert dialog on {@code owner} with the given parameters.","lastModifiedDate":"2017-08-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * This method only returns after the user has closed the alert dialog.","lastModifiedDate":"2017-08-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static void showAlertDialogAndWait(Stage owner, AlertType type, String title, String headerText,","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String contentText) {","lastModifiedDate":"2016-08-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" final Alert alert \u003d new Alert(type);","lastModifiedDate":"2016-08-18"},{"lineNumber":68,"author":{"gitId":"-"},"content":" alert.getDialogPane().getStylesheets().add(\"view/DarkTheme.css\");","lastModifiedDate":"2016-08-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" alert.initOwner(owner);","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" alert.setTitle(title);","lastModifiedDate":"2016-08-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" alert.setHeaderText(headerText);","lastModifiedDate":"2016-08-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":" alert.setContentText(contentText);","lastModifiedDate":"2016-08-18"},{"lineNumber":73,"author":{"gitId":"-"},"content":" alert.getDialogPane().setId(ALERT_DIALOG_PANE_FIELD_ID);","lastModifiedDate":"2016-10-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" alert.showAndWait();","lastModifiedDate":"2016-08-18"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Shows an error alert dialog with {@code title} and error message, {@code e},","lastModifiedDate":"2017-08-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * and exits the application after the user has closed the alert dialog.","lastModifiedDate":"2017-08-16"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private void showFatalErrorDialogAndShutdown(String title, Throwable e) {","lastModifiedDate":"2016-09-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" logger.severe(title + \" \" + e.getMessage() + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" showAlertDialogAndWait(Alert.AlertType.ERROR, title, e.getMessage(), e.toString());","lastModifiedDate":"2016-08-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Platform.exit();","lastModifiedDate":"2016-08-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" System.exit(1);","lastModifiedDate":"2016-08-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"tsulim":5,"-":83}},{"path":"src/main/java/staffconnect/ui/UiPart.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-12-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.net.URL;","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.fxml.FXMLLoader;","lastModifiedDate":"2016-12-21"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.MainApp;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Represents a distinct part of the UI. e.g. Windows, dialogs, panels, status bars, etc.","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It contains a scene graph with a root node of type {@code T}.","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public abstract class UiPart\u003cT\u003e {","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /** Resource folder where FXML files are stored. */","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String FXML_FILE_FOLDER \u003d \"/view/\";","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final FXMLLoader fxmlLoader \u003d new FXMLLoader();","lastModifiedDate":"2017-11-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file URL.","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * The FXML file must not specify the {@code fx:controller} attribute.","lastModifiedDate":"2016-12-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public UiPart(URL fxmlFileUrl) {","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" loadFxmlFile(fxmlFileUrl, null);","lastModifiedDate":"2017-11-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Constructs a UiPart using the specified FXML file within {@link #FXML_FILE_FOLDER}.","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @see #UiPart(URL)","lastModifiedDate":"2016-12-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public UiPart(String fxmlFileName) {","lastModifiedDate":"2016-12-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this(getFxmlFileUrl(fxmlFileName));","lastModifiedDate":"2017-11-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file URL and root object.","lastModifiedDate":"2017-11-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * The FXML file must not specify the {@code fx:controller} attribute.","lastModifiedDate":"2017-11-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public UiPart(URL fxmlFileUrl, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" loadFxmlFile(fxmlFileUrl, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file within {@link #FXML_FILE_FOLDER} and root object.","lastModifiedDate":"2017-11-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * @see #UiPart(URL, T)","lastModifiedDate":"2017-11-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public UiPart(String fxmlFileName, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this(getFxmlFileUrl(fxmlFileName), root);","lastModifiedDate":"2017-11-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Returns the root object of the scene graph of this UiPart.","lastModifiedDate":"2016-12-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public T getRoot() {","lastModifiedDate":"2016-12-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return fxmlLoader.getRoot();","lastModifiedDate":"2016-12-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Loads the object hierarchy from a FXML document.","lastModifiedDate":"2017-11-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @param location Location of the FXML document.","lastModifiedDate":"2017-11-29"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @param root Specifies the root of the object hierarchy.","lastModifiedDate":"2017-11-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private void loadFxmlFile(URL location, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":" requireNonNull(location);","lastModifiedDate":"2017-11-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":" fxmlLoader.setLocation(location);","lastModifiedDate":"2017-11-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":" fxmlLoader.setController(this);","lastModifiedDate":"2017-11-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" fxmlLoader.setRoot(root);","lastModifiedDate":"2017-11-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-11-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":" fxmlLoader.load();","lastModifiedDate":"2017-11-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2017-11-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new AssertionError(e);","lastModifiedDate":"2017-11-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Returns the FXML file URL for the specified FXML file name within {@link #FXML_FILE_FOLDER}.","lastModifiedDate":"2017-11-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static URL getFxmlFileUrl(String fxmlFileName) {","lastModifiedDate":"2017-11-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" requireNonNull(fxmlFileName);","lastModifiedDate":"2017-11-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":" String fxmlFileNameWithFolder \u003d FXML_FILE_FOLDER + fxmlFileName;","lastModifiedDate":"2017-11-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":" URL fxmlFileUrl \u003d MainApp.class.getResource(fxmlFileNameWithFolder);","lastModifiedDate":"2017-11-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return requireNonNull(fxmlFileUrl);","lastModifiedDate":"2017-11-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"tsulim":2,"-":86}},{"path":"src/test/java/staffconnect/AppParametersTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-04-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2018-04-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class AppParametersTest {","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private final ParametersStub parametersStub \u003d new ParametersStub();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final AppParameters expected \u003d new AppParameters();","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void parse_validConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", \"config.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" expected.setConfigPath(Paths.get(\"config.json\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void parse_nullConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", null);","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void parse_invalidConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", \"a\\0\");","lastModifiedDate":"2018-04-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expected.setConfigPath(null);","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String expected \u003d AppParameters.class.getCanonicalName() + \"{configPath\u003d\" + appParameters.getConfigPath() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertEquals(expected, appParameters.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertTrue(appParameters.equals(new AppParameters()));","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertTrue(appParameters.equals(appParameters));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // different config path -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" AppParameters otherAppParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" otherAppParameters.setConfigPath(Paths.get(\"configPath\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(otherAppParameters));","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private static class ParametersStub extends Application.Parameters {","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private Map\u003cString, String\u003e namedParameters \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2018-04-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getRaw() {","lastModifiedDate":"2018-04-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" throw new AssertionError(\"should not be called\");","lastModifiedDate":"2018-04-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getUnnamed() {","lastModifiedDate":"2018-04-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new AssertionError(\"should not be called\");","lastModifiedDate":"2018-04-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public Map\u003cString, String\u003e getNamed() {","lastModifiedDate":"2018-04-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return Collections.unmodifiableMap(namedParameters);","lastModifiedDate":"2018-04-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-04-21"}],"authorContributionMap":{"tsulim":1,"-":88}},{"path":"src/test/java/staffconnect/commons/core/ConfigTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class ConfigTest {","lastModifiedDate":"2016-09-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" Config config \u003d new Config();","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" String expected \u003d Config.class.getCanonicalName() + \"{logLevel\u003d\" + config.getLogLevel()","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \", userPrefsFilePath\u003d\" + config.getUserPrefsFilePath() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" assertEquals(expected, config.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public void equalsMethod() {","lastModifiedDate":"2016-09-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Config defaultConfig \u003d new Config();","lastModifiedDate":"2016-09-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertNotNull(defaultConfig);","lastModifiedDate":"2016-10-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertTrue(defaultConfig.equals(defaultConfig));","lastModifiedDate":"2016-09-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-30"}],"authorContributionMap":{"tsulim":1,"-":26}},{"path":"src/test/java/staffconnect/commons/core/GuiSettingsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class GuiSettingsTest {","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings();","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" String expected \u003d GuiSettings.class.getCanonicalName() + \"{windowWidth\u003d\" + guiSettings.getWindowWidth()","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" + \", windowHeight\u003d\" + guiSettings.getWindowHeight() + \", windowCoordinates\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + guiSettings.getWindowCoordinates() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertEquals(expected, guiSettings.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-23"}],"authorContributionMap":{"tsulim":1,"-":15}},{"path":"src/test/java/staffconnect/commons/core/VersionTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class VersionTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void versionParsing_acceptableVersionString_parsedVersionCorrectly() {","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V0.0.0ea\", 0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V3.10.2\", 3, 10, 2, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V100.100.100ea\", 100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void versionParsing_wrongVersionString_throwIllegalArgumentException() {","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e Version.fromString(\"This is not a version string\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void versionConstructor_correctParameter_valueAsExpected() {","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" Version version \u003d new Version(19, 10, 20, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(19, version.getMajor());","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertEquals(10, version.getMinor());","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(20, version.getPatch());","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertEquals(true, version.isEarlyAccess());","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public void versionToString_validVersion_correctStringRepresentation() {","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // boundary at 0","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Version version \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(\"V0.0.0ea\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // normal values","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" version \u003d new Version(4, 10, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertEquals(\"V4.10.5\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // big numbers","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" version \u003d new Version(100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertEquals(\"V100.100.100ea\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_compareToIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Version one;","lastModifiedDate":"2017-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Version another;","lastModifiedDate":"2017-09-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // Tests equality","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003d\u003d 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" one \u003d new Version(11, 12, 13, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" another \u003d new Version(11, 12, 13, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003d\u003d 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // Tests different patch","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // Tests different minor","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 5, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // Tests different major","lastModifiedDate":"2016-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" one \u003d new Version(10, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // Tests high major vs low minor","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" one \u003d new Version(10, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 1, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" // Tests high patch vs low minor","lastModifiedDate":"2016-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 10, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 1, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // Tests same major minor different patch","lastModifiedDate":"2016-08-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // Tests early access vs not early access on same version number","lastModifiedDate":"2016-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // Tests early access lower version vs not early access higher version compare by version number first","lastModifiedDate":"2016-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // Tests early access higher version vs not early access lower version compare by version number first","lastModifiedDate":"2016-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_hashCodeIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" Version version \u003d new Version(100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertEquals(100100100, version.hashCode());","lastModifiedDate":"2016-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" version \u003d new Version(10, 10, 10, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertEquals(1010010010, version.hashCode());","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_equalIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Version one;","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Version another;","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertTrue(one.equals(another));","lastModifiedDate":"2016-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" one \u003d new Version(100, 191, 275, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" another \u003d new Version(100, 191, 275, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertTrue(one.equals(another));","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" private void verifyVersionParsedCorrectly(String versionString,","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" int major, int minor, int patch, boolean isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertEquals(new Version(major, minor, patch, isEarlyAccess), Version.fromString(versionString));","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":2,"-":133}},{"path":"src/test/java/staffconnect/commons/core/index/IndexTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.core.index;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class IndexTest {","lastModifiedDate":"2017-05-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void createOneBasedIndex() {","lastModifiedDate":"2017-05-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" // invalid index","lastModifiedDate":"2017-05-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" assertThrows(IndexOutOfBoundsException.class, () -\u003e Index.fromOneBased(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" // check equality using the same base","lastModifiedDate":"2017-05-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" assertEquals(1, Index.fromOneBased(1).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertEquals(5, Index.fromOneBased(5).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" // convert from one-based index to zero-based index","lastModifiedDate":"2017-05-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertEquals(0, Index.fromOneBased(1).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertEquals(4, Index.fromOneBased(5).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void createZeroBasedIndex() {","lastModifiedDate":"2017-05-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // invalid index","lastModifiedDate":"2017-05-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertThrows(IndexOutOfBoundsException.class, () -\u003e Index.fromZeroBased(-1));","lastModifiedDate":"2019-03-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // check equality using the same base","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertEquals(0, Index.fromZeroBased(0).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertEquals(5, Index.fromZeroBased(5).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // convert from zero-based index to one-based index","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertEquals(1, Index.fromZeroBased(0).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(6, Index.fromZeroBased(5).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-05-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" final Index fifthPersonIndex \u003d Index.fromOneBased(5);","lastModifiedDate":"2017-05-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(Index.fromOneBased(5)));","lastModifiedDate":"2017-05-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(Index.fromZeroBased(4)));","lastModifiedDate":"2017-05-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(fifthPersonIndex));","lastModifiedDate":"2017-05-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(null));","lastModifiedDate":"2017-05-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(5.0f));","lastModifiedDate":"2017-05-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(Index.fromOneBased(1)));","lastModifiedDate":"2017-05-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromZeroBased(0);","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" String expected \u003d Index.class.getCanonicalName() + \"{zeroBasedIndex\u003d\" + index.getZeroBased() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertEquals(expected, index.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"tsulim":2,"-":65}},{"path":"src/test/java/staffconnect/commons/util/AppUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class AppUtilTest {","lastModifiedDate":"2016-09-30"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public void getImage_exitingImage() {","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" assertNotNull(AppUtil.getImage(\"/images/address_book_32.png\"));","lastModifiedDate":"2016-09-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void getImage_nullGiven_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e AppUtil.getImage(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void checkArgument_true_nothingHappens() {","lastModifiedDate":"2017-05-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" AppUtil.checkArgument(true);","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" AppUtil.checkArgument(true, \"\");","lastModifiedDate":"2017-05-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void checkArgument_falseWithoutErrorMessage_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e AppUtil.checkArgument(false));","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void checkArgument_falseWithErrorMessage_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String errorMessage \u003d \"error message\";","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, errorMessage, () -\u003e AppUtil.checkArgument(false, errorMessage));","lastModifiedDate":"2019-03-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-30"}],"authorContributionMap":{"tsulim":2,"-":34}},{"path":"src/test/java/staffconnect/commons/util/CollectionUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2016-12-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-14"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class CollectionUtilTest {","lastModifiedDate":"2016-12-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void requireAllNonNullVarargs() {","lastModifiedDate":"2017-05-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // no arguments","lastModifiedDate":"2017-01-14"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown();","lastModifiedDate":"2017-05-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":" // any non-empty argument list","lastModifiedDate":"2017-01-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(new Object(), new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(\"test\");","lastModifiedDate":"2017-05-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(\"\");","lastModifiedDate":"2017-05-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // argument lists with just one null at the beginning","lastModifiedDate":"2017-01-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Object) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(null, \"\", new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(null, new Object(), new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // argument lists with nulls in the middle","lastModifiedDate":"2017-01-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(new Object(), null, null, \"test\");","lastModifiedDate":"2017-05-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(\"\", null, new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // argument lists with one null as the last argument","lastModifiedDate":"2017-01-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(\"\", new Object(), null);","lastModifiedDate":"2017-05-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(new Object(), new Object(), null);","lastModifiedDate":"2017-05-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // null reference","lastModifiedDate":"2017-05-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Object[]) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // confirms nulls inside lists in the argument list are not considered","lastModifiedDate":"2017-01-14"},{"lineNumber":43,"author":{"gitId":"-"},"content":" List\u003cObject\u003e containingNull \u003d Arrays.asList((Object) null);","lastModifiedDate":"2017-01-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(containingNull, new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void requireAllNonNullCollection() {","lastModifiedDate":"2017-05-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // lists containing nulls in the front","lastModifiedDate":"2017-01-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList((Object) null));","lastModifiedDate":"2017-05-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(null, new Object(), \"\"));","lastModifiedDate":"2017-05-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // lists containing nulls in the middle","lastModifiedDate":"2017-01-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", null, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", null, \"eggs\", null, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // lists containing nulls at the end","lastModifiedDate":"2017-01-14"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", new Object(), null));","lastModifiedDate":"2017-05-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(new Object(), null));","lastModifiedDate":"2017-05-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" // null reference","lastModifiedDate":"2017-05-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Collection\u003cObject\u003e) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // empty list","lastModifiedDate":"2017-01-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Collections.emptyList());","lastModifiedDate":"2017-05-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // list with all non-null elements","lastModifiedDate":"2017-01-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(new Object(), \"ham\", Integer.valueOf(1)));","lastModifiedDate":"2018-04-01"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // confirms nulls inside nested lists are not considered","lastModifiedDate":"2017-01-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" List\u003cObject\u003e containingNull \u003d Arrays.asList((Object) null);","lastModifiedDate":"2017-01-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(containingNull, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void isAnyNonNull() {","lastModifiedDate":"2017-06-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull());","lastModifiedDate":"2017-06-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull((Object) null));","lastModifiedDate":"2017-06-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull((Object[]) null));","lastModifiedDate":"2017-06-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertTrue(CollectionUtil.isAnyNonNull(new Object()));","lastModifiedDate":"2017-06-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertTrue(CollectionUtil.isAnyNonNull(new Object(), null));","lastModifiedDate":"2017-06-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Asserts that {@code CollectionUtil#requireAllNonNull(Object...)} throw {@code NullPointerException}","lastModifiedDate":"2017-08-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * if {@code objects} or any element of {@code objects} is null.","lastModifiedDate":"2017-08-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":89,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionThrown(Object... objects) {","lastModifiedDate":"2017-05-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e requireAllNonNull(objects));","lastModifiedDate":"2019-03-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * Asserts that {@code CollectionUtil#requireAllNonNull(Collection\u003c?\u003e)} throw {@code NullPointerException}","lastModifiedDate":"2017-08-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * if {@code collection} or any element of {@code collection} is null.","lastModifiedDate":"2017-08-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionThrown(Collection\u003c?\u003e collection) {","lastModifiedDate":"2017-05-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e requireAllNonNull(collection));","lastModifiedDate":"2019-03-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionNotThrown(Object... objects) {","lastModifiedDate":"2017-05-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":" requireAllNonNull(objects);","lastModifiedDate":"2017-05-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":105,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionNotThrown(Collection\u003c?\u003e collection) {","lastModifiedDate":"2017-05-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":" requireAllNonNull(collection);","lastModifiedDate":"2017-05-19"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-22"}],"authorContributionMap":{"tsulim":3,"-":105}},{"path":"src/test/java/staffconnect/commons/util/ConfigUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.Config;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class ConfigUtilTest {","lastModifiedDate":"2016-09-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"ConfigUtilTest\");","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Path tempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void read_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e read(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void read_missingFile_emptyResult() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(read(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void read_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertThrows(DataLoadingException.class, () -\u003e read(\"NotJsonFormatConfig.json\"));","lastModifiedDate":"2023-06-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void read_fileInOrder_successfullyRead() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Config expected \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"TypicalConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void read_valuesMissingFromFile_defaultValuesUsed() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"EmptyConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertEquals(new Config(), actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void read_extraValuesInFile_extraValuesIgnored() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Config expected \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"ExtraValuesConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private Config getTypicalConfig() {","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Config config \u003d new Config();","lastModifiedDate":"2016-09-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" config.setLogLevel(Level.INFO);","lastModifiedDate":"2016-09-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" config.setUserPrefsFilePath(Paths.get(\"preferences.json\"));","lastModifiedDate":"2018-04-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return config;","lastModifiedDate":"2016-09-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private Optional\u003cConfig\u003e read(String configFileInTestDataFolder) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" Path configFilePath \u003d addToTestDataPathIfNotNull(configFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return ConfigUtil.readConfig(configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void save_nullConfig_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e save(null, \"SomeFile.json\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void save_nullFile_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e save(new Config(), null));","lastModifiedDate":"2019-03-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void saveConfig_allInOrder_success() throws DataLoadingException, IOException {","lastModifiedDate":"2023-06-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Config original \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Path configFilePath \u003d tempDir.resolve(\"TempConfig.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":92,"author":{"gitId":"-"},"content":" //Try writing when the file doesn\u0027t exist","lastModifiedDate":"2016-09-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(original, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Config readBack \u003d ConfigUtil.readConfig(configFilePath).get();","lastModifiedDate":"2016-12-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":" //Try saving when the file exists","lastModifiedDate":"2016-09-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" original.setLogLevel(Level.FINE);","lastModifiedDate":"2016-09-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(original, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":100,"author":{"gitId":"-"},"content":" readBack \u003d ConfigUtil.readConfig(configFilePath).get();","lastModifiedDate":"2016-12-20"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":" private void save(Config config, String configFileInTestDataFolder) throws IOException {","lastModifiedDate":"2016-09-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Path configFilePath \u003d addToTestDataPathIfNotNull(configFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":106,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(config, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String configFileInTestDataFolder) {","lastModifiedDate":"2018-04-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return configFileInTestDataFolder !\u003d null","lastModifiedDate":"2016-09-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(configFileInTestDataFolder)","lastModifiedDate":"2018-04-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2016-09-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"tsulim":4,"-":112}},{"path":"src/test/java/staffconnect/commons/util/FileUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class FileUtilTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void isValidPath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":" // valid path","lastModifiedDate":"2018-04-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertTrue(FileUtil.isValidPath(\"valid/file/path\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" // invalid path","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" assertFalse(FileUtil.isValidPath(\"a\\0\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // null path -\u003e throws NullPointerException","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e FileUtil.isValidPath(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":2,"-":21}},{"path":"src/test/java/staffconnect/commons/util/JsonUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-10-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.SerializableTestClass;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.TestUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Tests JSON Read and Write","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class JsonUtilTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Path SERIALIZATION_FILE \u003d TestUtil.getFilePathInSandboxFolder(\"serialize.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void serializeObjectToJsonFile_noExceptionThrown() throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":" SerializableTestClass serializableTestClass \u003d new SerializableTestClass();","lastModifiedDate":"2016-10-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":" serializableTestClass.setTestValues();","lastModifiedDate":"2016-10-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":" JsonUtil.serializeObjectToJsonFile(SERIALIZATION_FILE, serializableTestClass);","lastModifiedDate":"2016-10-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(FileUtil.readFromFile(SERIALIZATION_FILE), SerializableTestClass.JSON_STRING_REPRESENTATION);","lastModifiedDate":"2016-10-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void deserializeObjectFromJsonFile_noExceptionThrown() throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(SERIALIZATION_FILE, SerializableTestClass.JSON_STRING_REPRESENTATION);","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" SerializableTestClass serializableTestClass \u003d JsonUtil","lastModifiedDate":"2016-10-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .deserializeObjectFromJsonFile(SERIALIZATION_FILE, SerializableTestClass.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getName(), SerializableTestClass.getNameTestValue());","lastModifiedDate":"2016-10-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getListOfLocalDateTimes(), SerializableTestClass.getListTestValues());","lastModifiedDate":"2016-10-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getMapOfIntegerToString(), SerializableTestClass.getHashMapTestValues());","lastModifiedDate":"2016-10-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":" //TODO: @Test jsonUtil_readJsonStringToObjectInstance_correctObject()","lastModifiedDate":"2016-09-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":" //TODO: @Test jsonUtil_writeThenReadObjectToJson_correctObject()","lastModifiedDate":"2016-09-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":3,"-":42}},{"path":"src/test/java/staffconnect/commons/util/StringUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.commons.util;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class StringUtilTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":" //---------------- Tests for isNonZeroUnsignedInteger --------------------------------------","lastModifiedDate":"2019-02-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void isNonZeroUnsignedInteger() {","lastModifiedDate":"2019-02-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // EP: empty strings","lastModifiedDate":"2016-10-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"\")); // Boundary value","lastModifiedDate":"2017-06-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\" \"));","lastModifiedDate":"2017-06-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // EP: not a number","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"a\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"aaa\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // EP: zero","lastModifiedDate":"2016-10-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"0\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // EP: zero as prefix","lastModifiedDate":"2017-06-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"01\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // EP: signed numbers","lastModifiedDate":"2016-10-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"-1\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"+1\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // EP: numbers with white space","lastModifiedDate":"2016-10-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\" 10 \")); // Leading/trailing spaces","lastModifiedDate":"2017-06-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"1 0\")); // Spaces in the middle","lastModifiedDate":"2017-06-02"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // EP: number larger than Integer.MAX_VALUE","lastModifiedDate":"2017-06-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2017-06-02"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // EP: valid numbers, should return true","lastModifiedDate":"2016-10-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"1\")); // Boundary value","lastModifiedDate":"2017-06-02"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"10\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" //---------------- Tests for containsWordIgnoreCase --------------------------------------","lastModifiedDate":"2016-10-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Invalid equivalence partitions for word: null, empty, multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Invalid equivalence partitions for sentence: null","lastModifiedDate":"2016-10-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * The four test cases below test one invalid input at a time.","lastModifiedDate":"2016-10-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_nullWord_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", null));","lastModifiedDate":"2019-03-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_emptyWord_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, \"Word parameter cannot be empty\", ()","lastModifiedDate":"2019-03-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", \" \"));","lastModifiedDate":"2019-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_multipleWords_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, \"Word parameter should be a single word\", ()","lastModifiedDate":"2019-03-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", \"aaa BBB\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_nullSentence_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e StringUtil.containsWordIgnoreCase(null, \"abc\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * Valid equivalence partitions for word:","lastModifiedDate":"2016-10-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * - any word","lastModifiedDate":"2016-10-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * - word containing symbols/numbers","lastModifiedDate":"2016-10-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * - word with leading/trailing spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Valid equivalence partitions for sentence:","lastModifiedDate":"2016-10-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * - empty string","lastModifiedDate":"2016-10-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * - one word","lastModifiedDate":"2016-10-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * - multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * - sentence with extra spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Possible scenarios returning true:","lastModifiedDate":"2016-10-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * - matches first word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - last word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - middle word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - matches multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * Possible scenarios returning false:","lastModifiedDate":"2016-10-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * - query word matches part of a sentence word","lastModifiedDate":"2016-10-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * - sentence word matches part of the query word","lastModifiedDate":"2016-10-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * The test method below tries to verify all above with a reasonably low number of test cases.","lastModifiedDate":"2016-10-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_validInputs_correctResult() {","lastModifiedDate":"2016-10-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" // Empty sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"\", \"abc\")); // Boundary case","lastModifiedDate":"2016-10-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\" \", \"123\"));","lastModifiedDate":"2016-10-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Matches a partial word only","lastModifiedDate":"2016-10-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \"bb\")); // Sentence word bigger than query word","lastModifiedDate":"2016-10-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \"bbbb\")); // Query word bigger than sentence word","lastModifiedDate":"2016-10-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // Matches word in the sentence, different upper/lower case letters","lastModifiedDate":"2016-10-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bBb ccc\", \"Bbb\")); // First word (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bBb ccc@1\", \"CCc@1\")); // Last word (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\" AAA bBb ccc \", \"aaa\")); // Sentence has extra spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"Aaa\", \"aaa\")); // Only one word in sentence (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \" ccc \")); // Leading/trailing spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" // Matches multiple words in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"AAA bBb ccc bbb\", \"bbB\"));","lastModifiedDate":"2016-10-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" //---------------- Tests for getDetails --------------------------------------","lastModifiedDate":"2016-10-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Equivalence Partitions: null, valid throwable object","lastModifiedDate":"2016-10-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void getDetails_exceptionGiven() {","lastModifiedDate":"2016-09-30"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.getDetails(new FileNotFoundException(\"file not found\"))","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" .contains(\"java.io.FileNotFoundException: file not found\"));","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public void getDetails_nullGiven_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e StringUtil.getDetails(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"tsulim":2,"-":141}},{"path":"src/test/java/staffconnect/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.AddCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.CommandResult;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.ListCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.JsonAddressBookStorage;","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.JsonUserPrefsStorage;","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"tsulim"},"content":"import staffconnect.storage.StorageManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":34,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":137,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":138,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":155,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":156,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":159,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":168,"author":{"gitId":"-"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY;","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"tsulim":23,"-":152}},{"path":"src/test/java/staffconnect/logic/commands/AddCommandIntegrationTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code AddCommand}.","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class AddCommandIntegrationTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_newPerson_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" expectedModel.addPerson(validPerson);","lastModifiedDate":"2017-06-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertCommandSuccess(new AddCommand(validPerson), model,","lastModifiedDate":"2019-01-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expectedModel);","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(0);","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertCommandFailure(new AddCommand(personInList), model,","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" AddCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"tsulim":10,"-":38}},{"path":"src/test/java/staffconnect/logic/commands/AddCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-01-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-05-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class AddCommandTest {","lastModifiedDate":"2017-05-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new AddCommand(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2017-05-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2017-05-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new AddCommand(validPerson).execute(modelStub);","lastModifiedDate":"2019-01-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertEquals(String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2017-05-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" AddCommand addCommand \u003d new AddCommand(validPerson);","lastModifiedDate":"2018-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, AddCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2019-05-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-22"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person alice \u003d new PersonBuilder().withName(\"Alice\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Person bob \u003d new PersonBuilder().withName(\"Bob\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" AddCommand addAliceCommand \u003d new AddCommand(alice);","lastModifiedDate":"2017-06-22"},{"lineNumber":61,"author":{"gitId":"-"},"content":" AddCommand addBobCommand \u003d new AddCommand(bob);","lastModifiedDate":"2017-06-22"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" AddCommand addAliceCommandCopy \u003d new AddCommand(alice);","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2017-06-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2017-06-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2017-06-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" AddCommand addCommand \u003d new AddCommand(ALICE);","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" String expected \u003d AddCommand.class.getCanonicalName() + \"{toAdd\u003d\" + ALICE + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2017-05-12"},{"lineNumber":89,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":90,"author":{"gitId":"-"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2017-05-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":108,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":123,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":141,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":142,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":147,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":148,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":153,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":156,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":158,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":162,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":163,"author":{"gitId":"-"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2018-08-07"},{"lineNumber":164,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":165,"author":{"gitId":"-"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2018-08-07"},{"lineNumber":166,"author":{"gitId":"-"},"content":" private final Person person;","lastModifiedDate":"2018-08-07"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":168,"author":{"gitId":"-"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":169,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":170,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2018-08-07"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":173,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":175,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":176,"author":{"gitId":"-"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":181,"author":{"gitId":"-"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2017-05-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":183,"author":{"gitId":"-"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2017-05-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2017-05-12"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-07"},{"lineNumber":187,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":188,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":192,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":193,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":195,"author":{"gitId":"-"},"content":" personsAdded.add(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":" return new AddressBook();","lastModifiedDate":"2017-05-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-12"}],"authorContributionMap":{"tsulim":12,"-":192}},{"path":"src/test/java/staffconnect/logic/commands/ClearCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class ClearCommandTest {","lastModifiedDate":"2017-06-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void execute_emptyAddressBook_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void execute_nonEmptyAddressBook_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2018-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" expectedModel.setAddressBook(new AddressBook());","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-08"}],"authorContributionMap":{"tsulim":7,"-":25}},{"path":"src/test/java/staffconnect/logic/commands/CommandResultTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class CommandResultTest {","lastModifiedDate":"2018-12-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(new CommandResult(\"feedback\")));","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(new CommandResult(\"feedback\", false, false)));","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(commandResult));","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(null));","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(0.5f));","lastModifiedDate":"2018-12-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // different feedbackToUser value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"different\")));","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // different showHelp value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"feedback\", true, false)));","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // different exit value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"feedback\", false, true)));","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void hashcode() {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // same values -\u003e returns same hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(commandResult.hashCode(), new CommandResult(\"feedback\").hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // different feedbackToUser value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"different\").hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // different showHelp value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"feedback\", true, false).hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different exit value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"feedback\", false, true).hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String expected \u003d CommandResult.class.getCanonicalName() + \"{feedbackToUser\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" + commandResult.getFeedbackToUser() + \", showHelp\u003d\" + commandResult.isShowHelp()","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" + \", exit\u003d\" + commandResult.isExit() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertEquals(expected, commandResult.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-12-09"}],"authorContributionMap":{"tsulim":1,"-":62}},{"path":"src/test/java/staffconnect/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final String INVALID_NAME_DESC \u003d \" \" + PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2017-07-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \" + PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2017-07-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-07-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2017-07-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static final String INVALID_TAG_DESC \u003d \" \" + PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2017-07-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":122,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":123,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"tsulim":14,"-":114}},{"path":"src/test/java/staffconnect/logic/commands/DeleteCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for","lastModifiedDate":"2020-12-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * {@code DeleteCommand}.","lastModifiedDate":"2018-01-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class DeleteCommandTest {","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void execute_validIndexUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2018-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void execute_invalidIndexUnfilteredList_throwsCommandException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-06-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(outOfBoundIndex);","lastModifiedDate":"2018-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_validIndexFilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2018-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" showNoPerson(expectedModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void execute_invalidIndexFilteredList_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-06-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-06-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(outOfBoundIndex);","lastModifiedDate":"2018-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" DeleteCommand deleteFirstCommand \u003d new DeleteCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2018-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" DeleteCommand deleteSecondCommand \u003d new DeleteCommand(INDEX_SECOND_PERSON);","lastModifiedDate":"2018-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" DeleteCommand deleteFirstCommandCopy \u003d new DeleteCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2018-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(deleteSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Index targetIndex \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(targetIndex);","lastModifiedDate":"2019-02-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":" String expected \u003d DeleteCommand.class.getCanonicalName() + \"{targetIndex\u003d\" + targetIndex + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(expected, deleteCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show no one.","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":115,"author":{"gitId":"-"},"content":" private void showNoPerson(Model model) {","lastModifiedDate":"2017-06-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(p -\u003e false);","lastModifiedDate":"2017-06-12"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertTrue(model.getFilteredPersonList().isEmpty());","lastModifiedDate":"2018-02-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"tsulim":13,"-":107}},{"path":"src/test/java/staffconnect/logic/commands/EditCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for EditCommand.","lastModifiedDate":"2020-12-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"public class EditCommandTest {","lastModifiedDate":"2017-05-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void execute_allFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(editedPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_someFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Index indexLastPerson \u003d Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Person lastPerson \u003d model.getFilteredPersonList().get(indexLastPerson.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" PersonBuilder personInList \u003d new PersonBuilder(lastPerson);","lastModifiedDate":"2017-05-18"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person editedPerson \u003d personInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":63,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(indexLastPerson, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":65,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":68,"author":{"gitId":"-"},"content":" expectedModel.setPerson(lastPerson, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void execute_noFieldSpecifiedUnfilteredList_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":75,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON, new EditPersonDescriptor());","lastModifiedDate":"2018-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Person editedPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void execute_filteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Person personInFilteredList \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder(personInFilteredList).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2018-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Person firstPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(firstPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_SECOND_PERSON, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-01-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":113,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // edit person in filtered list into a duplicate in address book","lastModifiedDate":"2017-05-18"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":117,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2018-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder(personInList).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-01-25"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":125,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-05-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-18"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Edit filtered list where index is larger than size of filtered list,","lastModifiedDate":"2017-05-18"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * but smaller than size of address book","lastModifiedDate":"2017-05-18"},{"lineNumber":135,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-18"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":138,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-18"},{"lineNumber":140,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-05-18"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":143,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex,","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":151,"author":{"gitId":"-"},"content":" final EditCommand standardCommand \u003d new EditCommand(INDEX_FIRST_PERSON, DESC_AMY);","lastModifiedDate":"2018-08-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":" EditPersonDescriptor copyDescriptor \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-08"},{"lineNumber":155,"author":{"gitId":"-"},"content":" EditCommand commandWithSameValues \u003d new EditCommand(INDEX_FIRST_PERSON, copyDescriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(commandWithSameValues));","lastModifiedDate":"2017-05-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":159,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(standardCommand));","lastModifiedDate":"2017-05-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(null));","lastModifiedDate":"2017-05-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new ClearCommand()));","lastModifiedDate":"2017-05-08"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":168,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new EditCommand(INDEX_SECOND_PERSON, DESC_AMY)));","lastModifiedDate":"2017-05-25"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":" // different descriptor -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new EditCommand(INDEX_FIRST_PERSON, DESC_BOB)));","lastModifiedDate":"2017-05-25"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2019-02-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" String expected \u003d EditCommand.class.getCanonicalName() + \"{index\u003d\" + index + \", editPersonDescriptor\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" + editPersonDescriptor + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertEquals(expected, editCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-08"}],"authorContributionMap":{"tsulim":22,"-":162}},{"path":"src/test/java/staffconnect/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getName().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"tsulim":10,"-":61}},{"path":"src/test/java/staffconnect/logic/commands/ExitCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.ExitCommand.MESSAGE_EXIT_ACKNOWLEDGEMENT;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class ExitCommandTest {","lastModifiedDate":"2017-06-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void execute_exit_success() {","lastModifiedDate":"2017-06-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true);","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ExitCommand(), model, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-08"}],"authorContributionMap":{"tsulim":5,"-":15}},{"path":"src/test/java/staffconnect/logic/commands/FindCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.CARL;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.ELLE;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.FIONA;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code FindCommand}.","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class FindCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Model expectedModel \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2018-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"first\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"second\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" FindCommand findFirstCommand \u003d new FindCommand(firstPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" FindCommand findSecondCommand \u003d new FindCommand(secondPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" FindCommand findFirstCommandCopy \u003d new FindCommand(firstPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(findSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void execute_zeroKeywords_noPersonFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":59,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0);","lastModifiedDate":"2017-06-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\" \");","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" FindCommand command \u003d new FindCommand(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void execute_multipleKeywords_multiplePersonsFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 3);","lastModifiedDate":"2017-06-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\"Kurz Elle Kunz\");","lastModifiedDate":"2018-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" FindCommand command \u003d new FindCommand(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(CARL, ELLE, FIONA), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"keyword\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" FindCommand findCommand \u003d new FindCommand(predicate);","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" String expected \u003d FindCommand.class.getCanonicalName() + \"{predicate\u003d\" + predicate + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expected, findCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}.","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private NameContainsKeywordsPredicate preparePredicate(String userInput) {","lastModifiedDate":"2018-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return new NameContainsKeywordsPredicate(Arrays.asList(userInput.split(\"\\\\s+\")));","lastModifiedDate":"2018-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"tsulim":11,"-":80}},{"path":"src/test/java/staffconnect/logic/commands/HelpCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.HelpCommand.SHOWING_HELP_MESSAGE;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class HelpCommandTest {","lastModifiedDate":"2017-06-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void execute_help_success() {","lastModifiedDate":"2017-06-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(SHOWING_HELP_MESSAGE, true, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" assertCommandSuccess(new HelpCommand(), model, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-08"}],"authorContributionMap":{"tsulim":5,"-":15}},{"path":"src/test/java/staffconnect/logic/commands/ListCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.commands;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ModelManager;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for ListCommand.","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class ListCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private Model expectedModel;","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_listIsNotFiltered_showsSameList() {","lastModifiedDate":"2017-08-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ListCommand(), model, ListCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void execute_listIsFiltered_showsEverything() {","lastModifiedDate":"2017-08-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ListCommand(), model, ListCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"tsulim":8,"-":31}},{"path":"src/test/java/staffconnect/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":34,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":38,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":39,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.AddCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":40,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":41,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":44,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":45,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2017-06-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2018-07-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)","lastModifiedDate":"2018-07-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2023-07-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2023-07-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":109,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":135,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,","lastModifiedDate":"2017-12-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":141,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":142,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":149,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":153,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":161,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":168,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":172,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":175,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":176,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":179,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":180,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2017-12-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":183,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":184,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":" + INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":187,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":188,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC,","lastModifiedDate":"2017-12-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2017-12-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"tsulim":43,"-":153}},{"path":"src/test/java/staffconnect/logic/parser/AddressBookParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-06-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.AddCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.ClearCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.ExitCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.FindCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.HelpCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.ListCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"public class AddressBookParserTest {","lastModifiedDate":"2017-07-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private final AddressBookParser parser \u003d new AddressBookParser();","lastModifiedDate":"2017-07-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void parseCommand_add() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" AddCommand command \u003d (AddCommand) parser.parseCommand(PersonUtil.getAddCommand(person));","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertEquals(new AddCommand(person), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void parseCommand_clear() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD) instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD + \" 3\") instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void parseCommand_delete() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" DeleteCommand command \u003d (DeleteCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" DeleteCommand.COMMAND_WORD + \" \" + INDEX_FIRST_PERSON.getOneBased());","lastModifiedDate":"2017-06-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertEquals(new DeleteCommand(INDEX_FIRST_PERSON), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void parseCommand_edit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(person).build();","lastModifiedDate":"2017-06-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" EditCommand command \u003d (EditCommand) parser.parseCommand(EditCommand.COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" + INDEX_FIRST_PERSON.getOneBased() + \" \" + PersonUtil.getEditPersonDescriptorDetails(descriptor));","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertEquals(new EditCommand(INDEX_FIRST_PERSON, descriptor), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void parseCommand_exit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD) instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD + \" 3\") instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void parseCommand_find() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d Arrays.asList(\"foo\", \"bar\", \"baz\");","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" FindCommand command \u003d (FindCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" FindCommand.COMMAND_WORD + \" \" + keywords.stream().collect(Collectors.joining(\" \")));","lastModifiedDate":"2017-06-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertEquals(new FindCommand(new NameContainsKeywordsPredicate(keywords)), command);","lastModifiedDate":"2017-06-12"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parseCommand_help() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD) instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD + \" 3\") instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void parseCommand_list() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD) instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD + \" 3\") instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void parseCommand_unrecognisedInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE), ()","lastModifiedDate":"2019-03-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" -\u003e parser.parseCommand(\"\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public void parseCommand_unknownCommand_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_UNKNOWN_COMMAND, () -\u003e parser.parseCommand(\"unknownCommand\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"tsulim":20,"-":81}},{"path":"src/test/java/staffconnect/logic/parser/ArgumentTokenizerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class ArgumentTokenizerTest {","lastModifiedDate":"2016-10-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private final Prefix unknownPrefix \u003d new Prefix(\"--u\");","lastModifiedDate":"2016-10-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final Prefix pSlash \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-03-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final Prefix dashT \u003d new Prefix(\"-t\");","lastModifiedDate":"2016-10-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private final Prefix hatQ \u003d new Prefix(\"^Q\");","lastModifiedDate":"2016-10-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void tokenize_emptyArgsString_noValues() {","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String argsString \u003d \" \";","lastModifiedDate":"2016-10-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private void assertPreamblePresent(ArgumentMultimap argMultimap, String expectedPreamble) {","lastModifiedDate":"2017-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(expectedPreamble, argMultimap.getPreamble());","lastModifiedDate":"2017-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private void assertPreambleEmpty(ArgumentMultimap argMultimap) {","lastModifiedDate":"2017-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertTrue(argMultimap.getPreamble().isEmpty());","lastModifiedDate":"2017-03-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Asserts all the arguments in {@code argMultimap} with {@code prefix} match the {@code expectedValues}","lastModifiedDate":"2017-08-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * and only the last value is returned upon calling {@code ArgumentMultimap#getValue(Prefix)}.","lastModifiedDate":"2017-08-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private void assertArgumentPresent(ArgumentMultimap argMultimap, Prefix prefix, String... expectedValues) {","lastModifiedDate":"2017-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // Verify the last value is returned","lastModifiedDate":"2016-10-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[expectedValues.length - 1], argMultimap.getValue(prefix).get());","lastModifiedDate":"2017-06-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // Verify the number of values returned is as expected","lastModifiedDate":"2016-10-16"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertEquals(expectedValues.length, argMultimap.getAllValues(prefix).size());","lastModifiedDate":"2017-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Verify all values returned are as expected and in order","lastModifiedDate":"2016-10-16"},{"lineNumber":47,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c expectedValues.length; i++) {","lastModifiedDate":"2016-10-16"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[i], argMultimap.getAllValues(prefix).get(i));","lastModifiedDate":"2017-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private void assertArgumentAbsent(ArgumentMultimap argMultimap, Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(argMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void tokenize_noPrefixes_allTakenAsPreamble() {","lastModifiedDate":"2016-10-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String argsString \u003d \" some random string /t tag with leading and trailing spaces \";","lastModifiedDate":"2016-10-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString);","lastModifiedDate":"2017-03-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":61,"author":{"gitId":"-"},"content":" // Same string expected as preamble, but leading/trailing spaces should be trimmed","lastModifiedDate":"2016-10-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString.trim());","lastModifiedDate":"2017-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void tokenize_oneArgument() {","lastModifiedDate":"2016-10-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Preamble present","lastModifiedDate":"2016-10-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String argsString \u003d \" Some preamble string p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Some preamble string\");","lastModifiedDate":"2017-03-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // No preamble","lastModifiedDate":"2016-10-16"},{"lineNumber":75,"author":{"gitId":"-"},"content":" argsString \u003d \" p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void tokenize_multipleArguments() {","lastModifiedDate":"2016-10-16"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // Only two arguments are present","lastModifiedDate":"2016-10-16"},{"lineNumber":85,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-03-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // All three arguments are present","lastModifiedDate":"2017-05-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" argsString \u003d \"Different Preamble String ^Q111 -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Different Preamble String\");","lastModifiedDate":"2017-03-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"111\");","lastModifiedDate":"2017-03-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /* Also covers: Reusing of the tokenizer multiple times */","lastModifiedDate":"2016-10-16"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // Reuse tokenizer on an empty string to ensure ArgumentMultimap is correctly reset","lastModifiedDate":"2017-03-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // (i.e. no stale values from the previous tokenizing remain)","lastModifiedDate":"2017-03-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" argsString \u003d \"\";","lastModifiedDate":"2017-03-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /* Also covers: testing for prefixes not specified as a prefix */","lastModifiedDate":"2020-05-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Prefixes not previously given to the tokenizer should not return any values","lastModifiedDate":"2016-10-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" argsString \u003d unknownPrefix + \"some value\";","lastModifiedDate":"2017-05-09"},{"lineNumber":113,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, unknownPrefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString); // Unknown prefix is taken as part of preamble","lastModifiedDate":"2017-03-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsWithRepeats() {","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // Two arguments repeated, some have empty values","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value ^Q ^Q -t another dashT value p/ pSlash value -t\";","lastModifiedDate":"2017-03-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\", \"another dashT value\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-19"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsJoined() {","lastModifiedDate":"2017-05-19"},{"lineNumber":131,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleStringp/ pSlash joined-tjoined -t not joined^Qjoined\";","lastModifiedDate":"2017-05-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleStringp/ pSlash joined-tjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-05-19"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"not joined^Qjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public void equalsMethod() {","lastModifiedDate":"2016-10-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Prefix aaa \u003d new Prefix(\"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":143,"author":{"gitId":"-"},"content":" assertEquals(aaa, aaa);","lastModifiedDate":"2016-10-16"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertEquals(aaa, new Prefix(\"aaa\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, \"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, new Prefix(\"aab\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":150,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-16"}],"authorContributionMap":{"tsulim":1,"-":149}},{"path":"src/test/java/staffconnect/logic/parser/CommandParserTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.Command;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Contains helper methods for testing command parsers.","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class CommandParserTestUtil {","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is successful and the command created","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * equals to {@code expectedCommand}.","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static void assertParseSuccess(Parser\u003c? extends Command\u003e parser, String userInput,","lastModifiedDate":"2022-02-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Command expectedCommand) {","lastModifiedDate":"2022-02-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":" Command command \u003d parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" assertEquals(expectedCommand, command);","lastModifiedDate":"2017-07-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(\"Invalid userInput.\", pe);","lastModifiedDate":"2017-08-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is unsuccessful and the error message","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * equals to {@code expectedMessage}.","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static void assertParseFailure(Parser\u003c? extends Command\u003e parser, String userInput, String expectedMessage) {","lastModifiedDate":"2022-02-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" throw new AssertionError(\"The expected ParseException was not thrown.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-07-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, pe.getMessage());","lastModifiedDate":"2017-07-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"tsulim":3,"-":36}},{"path":"src/test/java/staffconnect/logic/parser/DeleteCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * As we are only doing white-box testing, our test cases do not cover path variations","lastModifiedDate":"2017-06-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * outside of the DeleteCommand code. For example, inputs \"1\" and \"1 abc\" take the","lastModifiedDate":"2017-06-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * same path through the DeleteCommand, and therefore we test only one of them.","lastModifiedDate":"2017-06-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The path variation for those two cases occur inside the ParserUtil, and","lastModifiedDate":"2017-06-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * therefore should be covered by the ParserUtilTest.","lastModifiedDate":"2017-06-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class DeleteCommandParserTest {","lastModifiedDate":"2017-06-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private DeleteCommandParser parser \u003d new DeleteCommandParser();","lastModifiedDate":"2017-06-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsDeleteCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"1\", new DeleteCommand(INDEX_FIRST_PERSON));","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void parse_invalidArgs_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"a\", String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"tsulim":6,"-":26}},{"path":"src/test/java/staffconnect/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":38,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.Messages;","lastModifiedDate":"2024-03-10"},{"lineNumber":39,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":40,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2024-03-10"},{"lineNumber":41,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":44,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":45,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"-5\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"0\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2018-09-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2018-09-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2018-09-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2018-09-22"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2018-09-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC + EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_DESC_HUSBAND + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_EMPTY + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_AMY + VALID_PHONE_AMY,","lastModifiedDate":"2017-07-06"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND","lastModifiedDate":"2017-06-06"},{"lineNumber":110,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND;","lastModifiedDate":"2017-06-06"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":112,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":115,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":122,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":127,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":136,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + NAME_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":138,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":141,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":143,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":147,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":149,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":150,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + ADDRESS_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":155,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":156,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":157,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":160,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + TAG_DESC_FRIEND;","lastModifiedDate":"2017-05-25"},{"lineNumber":161,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":162,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":166,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":167,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":169,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":172,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":173,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + PHONE_DESC_BOB;","lastModifiedDate":"2023-07-14"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":175,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":177,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":178,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + INVALID_PHONE_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":180,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":182,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":183,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" + TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND","lastModifiedDate":"2017-05-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":" + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;","lastModifiedDate":"2017-05-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":191,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC","lastModifiedDate":"2023-07-14"},{"lineNumber":192,"author":{"gitId":"-"},"content":" + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":194,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":200,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":201,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":204,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":206,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":208,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"tsulim":43,"-":165}},{"path":"src/test/java/staffconnect/logic/parser/FindCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.FindCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParserTest {","lastModifiedDate":"2017-06-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private FindCommandParser parser \u003d new FindCommandParser();","lastModifiedDate":"2017-06-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void parse_emptyArg_throwsParseException() {","lastModifiedDate":"2017-06-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \" \", String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsFindCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // no leading and trailing whitespaces","lastModifiedDate":"2017-06-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" FindCommand expectedFindCommand \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\")));","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"Alice Bob\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // multiple whitespaces between keywords","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \" \\n Alice \\n \\t Bob \\t\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-27"}],"authorContributionMap":{"tsulim":6,"-":28}},{"path":"src/test/java/staffconnect/logic/parser/ParserUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.logic.parser;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.ParserUtil.MESSAGE_INVALID_INDEX;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-05-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-05-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-05-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtilTest {","lastModifiedDate":"2017-05-22"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2017-05-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2017-05-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2017-05-22"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d \"Rachel Walker\";","lastModifiedDate":"2017-05-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d \"123456\";","lastModifiedDate":"2017-05-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d \"123 Main Street #0505\";","lastModifiedDate":"2017-05-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d \"rachel@example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_1 \u003d \"friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_2 \u003d \"neighbour\";","lastModifiedDate":"2017-05-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String WHITESPACE \u003d \" \\t\\r\\n\";","lastModifiedDate":"2017-05-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void parseIndex_invalidInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseIndex(\"10 a\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void parseIndex_outOfRangeInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_INVALID_INDEX, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" -\u003e ParserUtil.parseIndex(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2019-03-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void parseIndex_validInput_success() throws Exception {","lastModifiedDate":"2017-05-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // No whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\"1\"));","lastModifiedDate":"2017-05-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // Leading and trailing whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\" 1 \"));","lastModifiedDate":"2017-05-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void parseName_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseName((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parseName_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseName(INVALID_NAME));","lastModifiedDate":"2019-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parseName_validValueWithoutWhitespace_returnsName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(VALID_NAME));","lastModifiedDate":"2017-05-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String nameWithWhitespace \u003d WHITESPACE + VALID_NAME + WHITESPACE;","lastModifiedDate":"2017-05-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace));","lastModifiedDate":"2017-05-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void parsePhone_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePhone((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void parsePhone_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePhone(INVALID_PHONE));","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-22"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE));","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" String phoneWithWhitespace \u003d WHITESPACE + VALID_PHONE + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void parseAddress_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseAddress((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":110,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":111,"author":{"gitId":"-"},"content":" public void parseAddress_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseAddress(INVALID_ADDRESS));","lastModifiedDate":"2019-03-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":115,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-22"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":123,"author":{"gitId":"-"},"content":" String addressWithWhitespace \u003d WHITESPACE + VALID_ADDRESS + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-30"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public void parseEmail_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmail((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public void parseEmail_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmail(INVALID_EMAIL));","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-22"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL));","lastModifiedDate":"2017-05-30"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" String emailWithWhitespace \u003d WHITESPACE + VALID_EMAIL + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-30"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void parseTag_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTag(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":156,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public void parseTag_invalidValue_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTag(INVALID_TAG));","lastModifiedDate":"2019-03-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":161,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithoutWhitespace_returnsTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":163,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":164,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(VALID_TAG_1));","lastModifiedDate":"2017-05-30"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":167,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":168,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithWhitespace_returnsTrimmedTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":169,"author":{"gitId":"-"},"content":" String tagWithWhitespace \u003d WHITESPACE + VALID_TAG_1 + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(tagWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public void parseTags_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTags(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":179,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":180,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithInvalidTags_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, INVALID_TAG)));","lastModifiedDate":"2019-03-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":184,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public void parseTags_emptyCollection_returnsEmptySet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":186,"author":{"gitId":"-"},"content":" assertTrue(ParserUtil.parseTags(Collections.emptyList()).isEmpty());","lastModifiedDate":"2017-05-22"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":189,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":191,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e actualTagSet \u003d ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, VALID_TAG_2));","lastModifiedDate":"2017-05-22"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e expectedTagSet \u003d new HashSet\u003cTag\u003e(Arrays.asList(new Tag(VALID_TAG_1), new Tag(VALID_TAG_2)));","lastModifiedDate":"2017-05-22"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":194,"author":{"gitId":"-"},"content":" assertEquals(expectedTagSet, actualTagSet);","lastModifiedDate":"2017-05-22"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-22"}],"authorContributionMap":{"tsulim":10,"-":186}},{"path":"src/test/java/staffconnect/model/AddressBookTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2016-12-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-12-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-12-24"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookTest {","lastModifiedDate":"2016-12-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2016-12-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), addressBook.getPersonList());","lastModifiedDate":"2016-12-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e addressBook.resetData(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void resetData_withValidReadOnlyAddressBook_replacesData() {","lastModifiedDate":"2016-12-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" AddressBook newData \u003d getTypicalAddressBook();","lastModifiedDate":"2017-07-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" addressBook.resetData(newData);","lastModifiedDate":"2016-12-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(newData, addressBook);","lastModifiedDate":"2016-12-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void resetData_withDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Two persons with the same identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2018-04-19"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-04-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e newPersons \u003d Arrays.asList(ALICE, editedAlice);","lastModifiedDate":"2018-04-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBookStub newData \u003d new AddressBookStub(newPersons);","lastModifiedDate":"2018-03-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e addressBook.resetData(newData));","lastModifiedDate":"2019-03-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e addressBook.hasPerson(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(addressBook.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":" addressBook.addPerson(ALICE);","lastModifiedDate":"2018-08-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertTrue(addressBook.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" addressBook.addPerson(ALICE);","lastModifiedDate":"2018-08-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2018-08-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertTrue(addressBook.hasPerson(editedAlice));","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void getPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e addressBook.getPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expected \u003d AddressBook.class.getCanonicalName() + \"{persons\u003d\" + addressBook.getPersonList() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertEquals(expected, addressBook.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * A stub ReadOnlyAddressBook whose persons list can violate interface constraints.","lastModifiedDate":"2018-03-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static class AddressBookStub implements ReadOnlyAddressBook {","lastModifiedDate":"2016-12-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e persons \u003d FXCollections.observableArrayList();","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" AddressBookStub(Collection\u003cPerson\u003e persons) {","lastModifiedDate":"2018-03-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.persons.setAll(persons);","lastModifiedDate":"2016-12-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return persons;","lastModifiedDate":"2016-12-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-24"}],"authorContributionMap":{"tsulim":9,"-":99}},{"path":"src/test/java/staffconnect/model/ModelManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-31"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.AddressBookBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ModelManagerTest {","lastModifiedDate":"2017-05-31"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private ModelManager modelManager \u003d new ModelManager();","lastModifiedDate":"2018-08-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertEquals(new GuiSettings(), modelManager.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(new AddressBook(), new AddressBook(modelManager.getAddressBook()));","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefs_nullUserPrefs_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setUserPrefs(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void setUserPrefs_validUserPrefs_copiesUserPrefs() {","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"address/book/file/path\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1, 2, 3, 4));","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" modelManager.setUserPrefs(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(userPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Modifying userPrefs should not modify modelManager\u0027s userPrefs","lastModifiedDate":"2018-12-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs oldUserPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"new/address/book/file/path\"));","lastModifiedDate":"2018-12-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(oldUserPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setGuiSettings(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setGuiSettings_validGuiSettings_setsGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(1, 2, 3, 4);","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" modelManager.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertEquals(guiSettings, modelManager.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setAddressBookFilePath(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_validPath_setsAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Path path \u003d Paths.get(\"address/book/file/path\");","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" modelManager.setAddressBookFilePath(path);","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(path, modelManager.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.hasPerson(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(modelManager.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" modelManager.addPerson(ALICE);","lastModifiedDate":"2018-08-06"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(modelManager.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e modelManager.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-31"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"-"},"content":" AddressBook addressBook \u003d new AddressBookBuilder().withPerson(ALICE).withPerson(BENSON).build();","lastModifiedDate":"2017-07-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" AddressBook differentAddressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" modelManager \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2018-08-06"},{"lineNumber":104,"author":{"gitId":"-"},"content":" ModelManager modelManagerCopy \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2017-05-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManagerCopy));","lastModifiedDate":"2017-05-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManager));","lastModifiedDate":"2017-05-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(null));","lastModifiedDate":"2017-05-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(5));","lastModifiedDate":"2017-05-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":" // different addressBook -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(differentAddressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // different filteredList -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":" String[] keywords \u003d ALICE.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-19"},{"lineNumber":121,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(keywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" // resets modelManager to initial state for upcoming tests","lastModifiedDate":"2017-08-05"},{"lineNumber":125,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // different userPrefs -\u003e returns false","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" UserPrefs differentUserPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":" differentUserPrefs.setAddressBookFilePath(Paths.get(\"differentFilePath\"));","lastModifiedDate":"2018-08-09"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, differentUserPrefs)));","lastModifiedDate":"2018-11-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-31"}],"authorContributionMap":{"tsulim":8,"-":124}},{"path":"src/test/java/staffconnect/model/UserPrefsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class UserPrefsTest {","lastModifiedDate":"2018-11-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":" UserPrefs userPref \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e userPref.setGuiSettings(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e userPrefs.setAddressBookFilePath(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-11-27"}],"authorContributionMap":{"tsulim":2,"-":19}},{"path":"src/test/java/staffconnect/model/person/AddressTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class AddressTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Address(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void constructor_invalidAddress_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" String invalidAddress \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Address(invalidAddress));","lastModifiedDate":"2019-03-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void isValidAddress() {","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // null address","lastModifiedDate":"2017-12-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e Address.isValidAddress(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // invalid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertFalse(Address.isValidAddress(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Address.isValidAddress(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // valid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"Blk 456, Den Road, #01-355\"));","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"-\")); // one character","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"Leng Inc; 1234 Market St; San Francisco CA 2349879; USA\")); // long address","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Address address \u003d new Address(\"Valid Address\");","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertTrue(address.equals(new Address(\"Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(address.equals(address));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(address.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(address.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(address.equals(new Address(\"Other Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"tsulim":2,"-":54}},{"path":"src/test/java/staffconnect/model/person/EmailTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class EmailTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Email(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void constructor_invalidEmail_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" String invalidEmail \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(invalidEmail));","lastModifiedDate":"2019-03-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void isValidEmail() {","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // null email","lastModifiedDate":"2017-12-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e Email.isValidEmail(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // blank email","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // missing parts","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"@example.com\")); // missing local part","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjackexample.com\")); // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@\")); // missing domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // invalid parts","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@-\")); // invalid domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@exam_ple.com\")); // underscore in domain name","lastModifiedDate":"2018-02-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter jack@example.com\")); // spaces in local part","lastModifiedDate":"2017-04-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@exam ple.com\")); // spaces in domain name","lastModifiedDate":"2017-04-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\" peterjack@example.com\")); // leading space","lastModifiedDate":"2018-02-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com \")); // trailing space","lastModifiedDate":"2018-02-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@@example.com\")); // double \u0027@\u0027 symbol","lastModifiedDate":"2017-04-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter@jack@example.com\")); // \u0027@\u0027 symbol in local part","lastModifiedDate":"2017-04-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"-peterjack@example.com\")); // local part starts with a hyphen","lastModifiedDate":"2021-07-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack-@example.com\")); // local part ends with a hyphen","lastModifiedDate":"2021-07-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter..jack@example.com\")); // local part has two consecutive periods","lastModifiedDate":"2021-07-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example@com\")); // \u0027@\u0027 symbol in domain name","lastModifiedDate":"2017-04-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@.example.com\")); // domain name starts with a period","lastModifiedDate":"2018-02-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com.\")); // domain name ends with a period","lastModifiedDate":"2018-02-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@-example.com\")); // domain name starts with a hyphen","lastModifiedDate":"2018-02-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com-\")); // domain name ends with a hyphen","lastModifiedDate":"2018-02-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.c\")); // top level domain has less than two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // valid email","lastModifiedDate":"2017-01-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack_1190@example.com\")); // underscore in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack.1190@example.com\")); // period in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack+1190@example.com\")); // \u0027+\u0027 symbol in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack-1190@example.com\")); // hyphen in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"a@bc\")); // minimal","lastModifiedDate":"2018-02-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"test@localhost\")); // alphabets only","lastModifiedDate":"2017-01-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"123@145\")); // numeric local part and domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"a1+be.d@example1.com\")); // mixture of alphanumeric and special characters","lastModifiedDate":"2021-07-20"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"peter_jack@very-very-very-long-example.com\")); // long domain name","lastModifiedDate":"2018-02-09"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"if.you.dream.it_you.can.do.it@example.com\")); // long local part","lastModifiedDate":"2017-04-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"e1234567@u.nus.edu\")); // more than one period in domain","lastModifiedDate":"2021-07-20"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Email email \u003d new Email(\"valid@email\");","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertTrue(email.equals(new Email(\"valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertTrue(email.equals(email));","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertFalse(email.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertFalse(email.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(email.equals(new Email(\"other.valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"tsulim":2,"-":86}},{"path":"src/test/java/staffconnect/model/person/NameContainsKeywordsPredicateTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicateTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" List\u003cString\u003e firstPredicateKeywordList \u003d Collections.singletonList(\"first\");","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" List\u003cString\u003e secondPredicateKeywordList \u003d Arrays.asList(\"first\", \"second\");","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d new NameContainsKeywordsPredicate(secondPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicateCopy \u003d new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicateCopy));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(1));","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(null));","lastModifiedDate":"2017-06-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(secondPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void test_nameContainsKeywords_returnsTrue() {","lastModifiedDate":"2017-08-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // One keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Collections.singletonList(\"Alice\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Multiple keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // Only one matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Bob\", \"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Carol\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // Mixed-case keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"aLIce\", \"bOB\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void test_nameDoesNotContainKeywords_returnsFalse() {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // Zero keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Collections.emptyList());","lastModifiedDate":"2017-06-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // Non-matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // Keywords match phone, email and address, but does not match name","lastModifiedDate":"2017-06-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"12345\", \"alice@email.com\", \"Main\", \"Street\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").withPhone(\"12345\")","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .withEmail(\"alice@email.com\").withAddress(\"Main Street\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d List.of(\"keyword1\", \"keyword2\");","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(keywords);","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" String expected \u003d NameContainsKeywordsPredicate.class.getCanonicalName() + \"{keywords\u003d\" + keywords + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertEquals(expected, predicate.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"tsulim":2,"-":83}},{"path":"src/test/java/staffconnect/model/person/NameTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class NameTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Name(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void constructor_invalidName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" String invalidName \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(invalidName));","lastModifiedDate":"2019-03-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void isValidName() {","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // null name","lastModifiedDate":"2017-12-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e Name.isValidName(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"peter*\")); // contains non-alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // valid name","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"peter jack\")); // alphabets only","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"12345\")); // numbers only","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"peter the 2nd\")); // alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"Capital Tan\")); // with capital letters","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"David Roger Jackson Ray Jr 2nd\")); // long names","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Name name \u003d new Name(\"Valid Name\");","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(name.equals(new Name(\"Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertTrue(name.equals(name));","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertFalse(name.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertFalse(name.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertFalse(name.equals(new Name(\"Other Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"tsulim":2,"-":58}},{"path":"src/test/java/staffconnect/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2020-12-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2020-12-18"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedBob \u003d new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2020-12-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editedBob \u003d new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2018-04-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName() + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2019-02-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", address\u003d\" + ALICE.getAddress() + \", tags\u003d\" + ALICE.getTags() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"tsulim":10,"-":89}},{"path":"src/test/java/staffconnect/model/person/PhoneTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class PhoneTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Phone(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void constructor_invalidPhone_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" String invalidPhone \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(invalidPhone));","lastModifiedDate":"2019-03-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void isValidPhone() {","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // null phone number","lastModifiedDate":"2017-12-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e Phone.isValidPhone(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // invalid phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"91\")); // less than 3 numbers","lastModifiedDate":"2017-05-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"phone\")); // non-numeric","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"9011p041\")); // alphabets within digits","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"9312 1534\")); // spaces within digits","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // valid phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"911\")); // exactly 3 numbers","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"93121534\"));","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"124293842033123\")); // long phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Phone phone \u003d new Phone(\"999\");","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(new Phone(\"999\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(phone));","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(new Phone(\"995\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"tsulim":2,"-":58}},{"path":"src/test/java/staffconnect/model/person/UniquePersonListTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.PersonBuilder;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"public class UniquePersonListTest {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final UniquePersonList uniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void contains_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.contains(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void contains_personNotInList_returnsFalse() {","lastModifiedDate":"2018-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(uniquePersonList.contains(ALICE));","lastModifiedDate":"2018-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void contains_personInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(uniquePersonList.contains(ALICE));","lastModifiedDate":"2018-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void contains_personWithSameIdentityFieldsInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2018-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(uniquePersonList.contains(editedAlice));","lastModifiedDate":"2018-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void add_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.add(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void add_duplicatePerson_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.add(ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void setPerson_nullTargetPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPerson(null, ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void setPerson_nullEditedPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPerson(ALICE, null));","lastModifiedDate":"2019-03-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void setPerson_targetPersonNotInList_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList.setPerson(ALICE, ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonIsSamePerson_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" uniquePersonList.setPerson(ALICE, ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasSameIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2018-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" uniquePersonList.setPerson(ALICE, editedAlice);","lastModifiedDate":"2018-08-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(editedAlice);","lastModifiedDate":"2018-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasDifferentIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" uniquePersonList.setPerson(ALICE, BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasNonUniqueIdentity_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" uniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.setPerson(ALICE, BOB));","lastModifiedDate":"2019-03-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public void remove_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.remove(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void remove_personDoesNotExist_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList.remove(ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public void remove_existingPerson_removesPerson() {","lastModifiedDate":"2018-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" uniquePersonList.remove(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" public void setPersons_nullUniquePersonList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((UniquePersonList) null));","lastModifiedDate":"2019-03-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void setPersons_uniquePersonList_replacesOwnListWithProvidedUniquePersonList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(expectedUniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void setPersons_nullList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((List\u003cPerson\u003e) null));","lastModifiedDate":"2019-03-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void setPersons_list_replacesOwnListWithProvidedList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":151,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e personList \u003d Collections.singletonList(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":153,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(personList);","lastModifiedDate":"2018-08-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":155,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":159,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":" public void setPersons_listWithDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e listWithDuplicatePersons \u003d Arrays.asList(ALICE, ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.setPersons(listWithDuplicatePersons));","lastModifiedDate":"2019-03-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void asUnmodifiableObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2018-04-05"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":" -\u003e uniquePersonList.asUnmodifiableObservableList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":171,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-24"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-24"},{"lineNumber":173,"author":{"gitId":"-"},"content":" assertEquals(uniquePersonList.asUnmodifiableObservableList().toString(), uniquePersonList.toString());","lastModifiedDate":"2019-02-24"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"tsulim":9,"-":166}},{"path":"src/test/java/staffconnect/model/tag/TagTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.model.tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class TagTest {","lastModifiedDate":"2017-12-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":9,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":11,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Tag(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public void constructor_invalidTagName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":" String invalidTagName \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(invalidTagName));","lastModifiedDate":"2019-03-14"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void isValidTagName() {","lastModifiedDate":"2017-12-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // null tag name","lastModifiedDate":"2017-12-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e Tag.isValidTagName(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-12-04"}],"authorContributionMap":{"tsulim":2,"-":24}},{"path":"src/test/java/staffconnect/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"tsulim":9,"-":101}},{"path":"src/test/java/staffconnect/storage/JsonAddressBookStorageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.HOON;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.IDA;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorageTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"JsonAddressBookStorageTest\");","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void readAddressBook_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e readAddressBook(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private java.util.Optional\u003cReadOnlyAddressBook\u003e readAddressBook(String filePath) throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" return new JsonAddressBookStorage(Paths.get(filePath)).readAddressBook(addToTestDataPathIfNotNull(filePath));","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) {","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return prefsFileInTestDataFolder !\u003d null","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder)","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void read_missingFile_emptyResult() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(readAddressBook(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void read_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertThrows(DataLoadingException.class, () -\u003e readAddressBook(\"notJsonFormatAddressBook.json\"));","lastModifiedDate":"2023-06-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void readAddressBook_invalidPersonAddressBook_throwDataLoadingException() {","lastModifiedDate":"2023-06-14"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertThrows(DataLoadingException.class, () -\u003e readAddressBook(\"invalidPersonAddressBook.json\"));","lastModifiedDate":"2023-06-14"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void readAddressBook_invalidAndValidPersonAddressBook_throwDataLoadingException() {","lastModifiedDate":"2023-06-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertThrows(DataLoadingException.class, () -\u003e readAddressBook(\"invalidAndValidPersonAddressBook.json\"));","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void readAndSaveAddressBook_allInOrder_success() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Path filePath \u003d testFolder.resolve(\"TempAddressBook.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" AddressBook original \u003d getTypicalAddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" JsonAddressBookStorage jsonAddressBookStorage \u003d new JsonAddressBookStorage(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // Save in new file and read back","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook readBack \u003d jsonAddressBookStorage.readAddressBook(filePath).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // Modify data, overwrite exiting file, and read back","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" original.addPerson(HOON);","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" original.removePerson(ALICE);","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" readBack \u003d jsonAddressBookStorage.readAddressBook(filePath).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" // Save and read without specifying file path","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" original.addPerson(IDA);","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original); // file path not specified","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" readBack \u003d jsonAddressBookStorage.readAddressBook().get(); // file path not specified","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public void saveAddressBook_nullAddressBook_throwsNullPointerException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e saveAddressBook(null, \"SomeFile.json\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Saves {@code addressBook} at the specified {@code filePath}.","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private void saveAddressBook(ReadOnlyAddressBook addressBook, String filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(Paths.get(filePath))","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" .saveAddressBook(addressBook, addToTestDataPathIfNotNull(filePath));","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" throw new AssertionError(\"There should not be an error writing to the file.\", ioe);","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public void saveAddressBook_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e saveAddressBook(new AddressBook(), null));","lastModifiedDate":"2019-03-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"tsulim":9,"-":101}},{"path":"src/test/java/staffconnect/storage/JsonSerializableAddressBookTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.util.JsonUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.testutil.TypicalPersons;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class JsonSerializableAddressBookTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"JsonSerializableAddressBookTest\");","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Path TYPICAL_PERSONS_FILE \u003d TEST_DATA_FOLDER.resolve(\"typicalPersonsAddressBook.json\");","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final Path INVALID_PERSON_FILE \u003d TEST_DATA_FOLDER.resolve(\"invalidPersonAddressBook.json\");","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path DUPLICATE_PERSON_FILE \u003d TEST_DATA_FOLDER.resolve(\"duplicatePersonAddressBook.json\");","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void toModelType_typicalPersonsFile_success() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(TYPICAL_PERSONS_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" AddressBook addressBookFromFile \u003d dataFromFile.toModelType();","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" AddressBook typicalPersonsAddressBook \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(addressBookFromFile, typicalPersonsAddressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void toModelType_invalidPersonFile_throwsIllegalValueException() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(INVALID_PERSON_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, dataFromFile::toModelType);","lastModifiedDate":"2019-03-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void toModelType_duplicatePersons_throwsIllegalValueException() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(DUPLICATE_PERSON_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, JsonSerializableAddressBook.MESSAGE_DUPLICATE_PERSON,","lastModifiedDate":"2019-03-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" dataFromFile::toModelType);","lastModifiedDate":"2019-03-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"tsulim":6,"-":41}},{"path":"src/test/java/staffconnect/storage/JsonUserPrefsStorageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class JsonUserPrefsStorageTest {","lastModifiedDate":"2016-10-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"JsonUserPrefsStorageTest\");","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void readUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e readUserPrefs(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Optional\u003cUserPrefs\u003e readUserPrefs(String userPrefsFileInTestDataFolder) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Path prefsFilePath \u003d addToTestDataPathIfNotNull(userPrefsFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new JsonUserPrefsStorage(prefsFilePath).readUserPrefs(prefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void readUserPrefs_missingFile_emptyResult() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertFalse(readUserPrefs(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void readUserPrefs_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertThrows(DataLoadingException.class, () -\u003e readUserPrefs(\"NotJsonFormatUserPrefs.json\"));","lastModifiedDate":"2023-06-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String userPrefsFileInTestDataFolder) {","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return userPrefsFileInTestDataFolder !\u003d null","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(userPrefsFileInTestDataFolder)","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void readUserPrefs_fileInOrder_successfullyRead() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"TypicalUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void readUserPrefs_valuesMissingFromFile_defaultValuesUsed() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"EmptyUserPrefs.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void readUserPrefs_extraValuesInFile_extraValuesIgnored() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":68,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"ExtraValuesUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" private UserPrefs getTypicalUserPrefs() {","lastModifiedDate":"2017-02-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1000, 500, 300, 100));","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"addressbook.json\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return userPrefs;","lastModifiedDate":"2017-02-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void savePrefs_nullPrefs_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e saveUserPrefs(null, \"SomeFile.json\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void saveUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e saveUserPrefs(new UserPrefs(), null));","lastModifiedDate":"2019-03-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-15"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Saves {@code userPrefs} at the specified {@code prefsFileInTestDataFolder} filepath.","lastModifiedDate":"2017-08-15"},{"lineNumber":92,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" private void saveUserPrefs(UserPrefs userPrefs, String prefsFileInTestDataFolder) {","lastModifiedDate":"2017-08-15"},{"lineNumber":94,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(addToTestDataPathIfNotNull(prefsFileInTestDataFolder))","lastModifiedDate":"2016-10-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":" .saveUserPrefs(userPrefs);","lastModifiedDate":"2016-10-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"-"},"content":" throw new AssertionError(\"There should not be an error writing to the file\", ioe);","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void saveUserPrefs_allInOrder_success() throws DataLoadingException, IOException {","lastModifiedDate":"2023-06-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" UserPrefs original \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(1200, 200, 0, 2));","lastModifiedDate":"2018-11-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Path pefsFilePath \u003d testFolder.resolve(\"TempPrefs.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage jsonUserPrefsStorage \u003d new JsonUserPrefsStorage(pefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":" //Try writing when the file doesn\u0027t exist","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":113,"author":{"gitId":"-"},"content":" UserPrefs readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":" //Try saving when the file exists","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(5, 5, 5, 5));","lastModifiedDate":"2018-11-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":119,"author":{"gitId":"-"},"content":" readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"tsulim":5,"-":118}},{"path":"src/test/java/staffconnect/storage/StorageManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.storage;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.GuiSettings;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.UserPrefs;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class StorageManagerTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private StorageManager storageManager;","lastModifiedDate":"2017-04-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2016-10-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(getTempFilePath(\"ab\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(getTempFilePath(\"prefs\"));","lastModifiedDate":"2017-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" storageManager \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2017-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Path getTempFilePath(String fileName) {","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return testFolder.resolve(fileName);","lastModifiedDate":"2019-04-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void prefsReadSave() throws Exception {","lastModifiedDate":"2016-10-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-09-28"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Note: This is an integration test that verifies the StorageManager is properly wired to the","lastModifiedDate":"2016-09-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * {@link JsonUserPrefsStorage} class.","lastModifiedDate":"2016-10-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * More extensive testing of UserPref saving/reading is done in {@link JsonUserPrefsStorageTest} class.","lastModifiedDate":"2016-10-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":" UserPrefs original \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(300, 600, 4, 6));","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" storageManager.saveUserPrefs(original);","lastModifiedDate":"2016-09-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs retrieved \u003d storageManager.readUserPrefs().get();","lastModifiedDate":"2016-09-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertEquals(original, retrieved);","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void addressBookReadSave() throws Exception {","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Note: This is an integration test that verifies the StorageManager is properly wired to the","lastModifiedDate":"2016-10-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * {@link JsonAddressBookStorage} class.","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * More extensive testing of UserPref saving/reading is done in {@link JsonAddressBookStorageTest} class.","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" AddressBook original \u003d getTypicalAddressBook();","lastModifiedDate":"2017-07-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" storageManager.saveAddressBook(original);","lastModifiedDate":"2016-09-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook retrieved \u003d storageManager.readAddressBook().get();","lastModifiedDate":"2016-09-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(retrieved));","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void getAddressBookFilePath() {","lastModifiedDate":"2016-10-01"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertNotNull(storageManager.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":6,"-":62}},{"path":"src/test/java/staffconnect/testutil/AddressBookBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * A utility class to help with building Addressbook objects.","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Example usage: \u003cbr\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * {@code AddressBook ab \u003d new AddressBookBuilder().withPerson(\"John\", \"Doe\").build();}","lastModifiedDate":"2018-03-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AddressBookBuilder {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private AddressBook addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public AddressBookBuilder() {","lastModifiedDate":"2017-05-31"},{"lineNumber":16,"author":{"gitId":"-"},"content":" addressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public AddressBookBuilder(AddressBook addressBook) {","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" this.addressBook \u003d addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Adds a new {@code Person} to the {@code AddressBook} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public AddressBookBuilder withPerson(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2016-09-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddressBook build() {","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":3,"-":31}},{"path":"src/test/java/staffconnect/testutil/Assert.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2019-03-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.function.Executable;","lastModifiedDate":"2019-03-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-03-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-17"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * A set of assertion methods useful for writing tests.","lastModifiedDate":"2017-07-17"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class Assert {","lastModifiedDate":"2017-07-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Asserts that the {@code executable} throws the {@code expectedType} Exception.","lastModifiedDate":"2019-03-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * This is a wrapper method that invokes {@link Assertions#assertThrows(Class, Executable)}, to maintain consistency","lastModifiedDate":"2019-03-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * with our custom {@link #assertThrows(Class, String, Executable)} method.","lastModifiedDate":"2019-03-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * To standardize API calls in this project, users should use this method instead of","lastModifiedDate":"2019-03-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * {@link Assertions#assertThrows(Class, Executable)}.","lastModifiedDate":"2019-03-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static void assertThrows(Class\u003c? extends Throwable\u003e expectedType, Executable executable) {","lastModifiedDate":"2019-03-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Assertions.assertThrows(expectedType, executable);","lastModifiedDate":"2019-03-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-02-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-02-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-02-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Asserts that the {@code executable} throws the {@code expectedType} Exception with the {@code expectedMessage}.","lastModifiedDate":"2019-03-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * If there\u0027s no need for the verification of the exception\u0027s error message, call","lastModifiedDate":"2018-02-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * {@link #assertThrows(Class, Executable)} instead.","lastModifiedDate":"2019-03-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-03-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @see #assertThrows(Class, Executable)","lastModifiedDate":"2019-03-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-02-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static void assertThrows(Class\u003c? extends Throwable\u003e expectedType, String expectedMessage,","lastModifiedDate":"2019-03-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Executable executable) {","lastModifiedDate":"2019-03-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Throwable thrownException \u003d Assertions.assertThrows(expectedType, executable);","lastModifiedDate":"2019-03-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedMessage, thrownException.getMessage());","lastModifiedDate":"2019-03-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-17"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-17"}],"authorContributionMap":{"tsulim":1,"-":33}},{"path":"src/test/java/staffconnect/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"tsulim":8,"-":79}},{"path":"src/test/java/staffconnect/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Address;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Email;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Name;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Phone;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.util.SampleDataUtil;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":84,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return new Person(name, phone, email, address, tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":96,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"tsulim":8,"-":88}},{"path":"src/test/java/staffconnect/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.AddCommand;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import staffconnect.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.tag.Tag;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":32,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"tsulim":10,"-":52}},{"path":"src/test/java/staffconnect/testutil/SerializableTestClass.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * A class used to test serialization and deserialization","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class SerializableTestClass {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String JSON_STRING_REPRESENTATION \u003d String.format(\"{%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \" \\\"name\\\" : \\\"This is a test class\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" + \" \\\"listOfLocalDateTimes\\\" : \"","lastModifiedDate":"2016-10-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \"[ \\\"-999999999-01-01T00:00:00\\\", \\\"+999999999-12-31T23:59:59.999999999\\\", \"","lastModifiedDate":"2016-10-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"\\\"0001-01-01T01:01:00\\\" ],%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \" \\\"mapOfIntegerToString\\\" : {%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \" \\\"1\\\" : \\\"One\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \" \\\"2\\\" : \\\"Two\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \" \\\"3\\\" : \\\"Three\\\"%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \" }%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \"}\");","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String NAME_TEST_VALUE \u003d \"This is a test class\";","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private String name;","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private List\u003cLocalDateTime\u003e listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private HashMap\u003cInteger, String\u003e mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static String getNameTestValue() {","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return NAME_TEST_VALUE;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static List\u003cLocalDateTime\u003e getListTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" List\u003cLocalDateTime\u003e listOfLocalDateTimes \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.MIN);","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.MAX);","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.of(1, 1, 1, 1, 1));","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static HashMap\u003cInteger, String\u003e getHashMapTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" HashMap\u003cInteger, String\u003e mapOfIntegerToString \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(1, \"One\");","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(2, \"Two\");","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(3, \"Three\");","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void setTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" name \u003d getNameTestValue();","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" listOfLocalDateTimes \u003d getListTestValues();","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" mapOfIntegerToString \u003d getHashMapTestValues();","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public String getName() {","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public List\u003cLocalDateTime\u003e getListOfLocalDateTimes() {","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public HashMap\u003cInteger, String\u003e getMapOfIntegerToString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":1,"-":71}},{"path":"src/test/java/staffconnect/testutil/TestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.Model;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * A utility class for test cases.","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class TestUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Folder used for temp files created during testing. Ignored by Git.","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final Path SANDBOX_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"sandbox\");","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Appends {@code fileName} to the sandbox folder path and returns the resulting path.","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates the sandbox folder if it doesn\u0027t exist.","lastModifiedDate":"2016-09-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static Path getFilePathInSandboxFolder(String fileName) {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Files.createDirectories(SANDBOX_FOLDER);","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":" throw new RuntimeException(e);","lastModifiedDate":"2016-09-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return SANDBOX_FOLDER.resolve(fileName);","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Returns the middle index of the person in the {@code model}\u0027s person list.","lastModifiedDate":"2017-07-30"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static Index getMidIndex(Model model) {","lastModifiedDate":"2017-07-30"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return Index.fromOneBased(model.getFilteredPersonList().size() / 2);","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Returns the last index of the person in the {@code model}\u0027s person list.","lastModifiedDate":"2017-07-30"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static Index getLastIndex(Model model) {","lastModifiedDate":"2017-07-30"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-30"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns the person in the {@code model}\u0027s person list at {@code index}.","lastModifiedDate":"2017-07-30"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static Person getPerson(Model model, Index index) {","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return model.getFilteredPersonList().get(index.getZeroBased());","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"tsulim":4,"-":51}},{"path":"src/test/java/staffconnect/testutil/TypicalIndexes.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import staffconnect.commons.core.index.Index;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Index} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class TypicalIndexes {","lastModifiedDate":"2017-08-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Index INDEX_FIRST_PERSON \u003d Index.fromOneBased(1);","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Index INDEX_SECOND_PERSON \u003d Index.fromOneBased(2);","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Index INDEX_THIRD_PERSON \u003d Index.fromOneBased(3);","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-08-05"}],"authorContributionMap":{"tsulim":2,"-":10}},{"path":"src/test/java/staffconnect/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.testutil;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"import static staffconnect.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.AddressBook;","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"import staffconnect.model.person.Person;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2017-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .withEmail(\"heinz@example.com\").withAddress(\"wall street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withEmail(\"cornelia@example.com\").withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2018-03-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .withEmail(\"werner@example.com\").withAddress(\"michegan ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .withEmail(\"lydia@example.com\").withAddress(\"little tokyo\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .withEmail(\"anna@example.com\").withAddress(\"4th street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .withEmail(\"stefan@example.com\").withAddress(\"little india\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .withEmail(\"hans@example.com\").withAddress(\"chicago ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2017-09-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":68,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":76,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"tsulim":13,"-":63}},{"path":"src/test/java/staffconnect/ui/TestFxmlObject.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.beans.DefaultProperty;","lastModifiedDate":"2016-12-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * A test object which can be constructed via an FXML file.","lastModifiedDate":"2016-12-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Unlike other JavaFX classes, this class can be constructed without the JavaFX toolkit being initialized.","lastModifiedDate":"2016-12-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"@DefaultProperty(\"text\")","lastModifiedDate":"2016-12-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class TestFxmlObject {","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private String text;","lastModifiedDate":"2016-12-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public TestFxmlObject() {}","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public TestFxmlObject(String text) {","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" setText(text);","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public String getText() {","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return text;","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setText(String text) {","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.text \u003d text;","lastModifiedDate":"2016-12-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" if (!(other instanceof TestFxmlObject)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" TestFxmlObject otherTestFxmlObject \u003d (TestFxmlObject) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return Objects.equals(text, otherTestFxmlObject.text);","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"tsulim":1,"-":44}},{"path":"src/test/java/staffconnect/ui/UiPartTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"package staffconnect.ui;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"import static staffconnect.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.net.URL;","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2019-04-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"import staffconnect.MainApp;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class UiPartTest {","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String MISSING_FILE_PATH \u003d \"UiPartTest/missingFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String INVALID_FILE_PATH \u003d \"UiPartTest/invalidFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String VALID_FILE_PATH \u003d \"UiPartTest/validFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String VALID_FILE_WITH_FX_ROOT_PATH \u003d \"UiPartTest/validFileWithFxRoot.fxml\";","lastModifiedDate":"2017-11-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final TestFxmlObject VALID_FILE_ROOT \u003d new TestFxmlObject(\"Hello World!\");","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void constructor_nullFileUrl_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((URL) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((URL) null, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public void constructor_missingFileUrl_throwsAssertionError() throws Exception {","lastModifiedDate":"2016-12-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" URL missingFileUrl \u003d new URL(testFolder.toUri().toURL(), MISSING_FILE_PATH);","lastModifiedDate":"2019-04-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(missingFileUrl));","lastModifiedDate":"2019-03-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(missingFileUrl, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void constructor_invalidFileUrl_throwsAssertionError() {","lastModifiedDate":"2016-12-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" URL invalidFileUrl \u003d getTestFileUrl(INVALID_FILE_PATH);","lastModifiedDate":"2016-12-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(invalidFileUrl));","lastModifiedDate":"2019-03-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(invalidFileUrl, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void constructor_validFileUrl_loadsFile() {","lastModifiedDate":"2016-12-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" URL validFileUrl \u003d getTestFileUrl(VALID_FILE_PATH);","lastModifiedDate":"2016-12-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, new TestUiPart\u003cTestFxmlObject\u003e(validFileUrl).getRoot());","lastModifiedDate":"2016-12-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-11-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void constructor_validFileWithFxRootUrl_loadsFile() {","lastModifiedDate":"2017-11-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" URL validFileUrl \u003d getTestFileUrl(VALID_FILE_WITH_FX_ROOT_PATH);","lastModifiedDate":"2017-11-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":" TestFxmlObject root \u003d new TestFxmlObject();","lastModifiedDate":"2017-11-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, new TestUiPart\u003cTestFxmlObject\u003e(validFileUrl, root).getRoot());","lastModifiedDate":"2017-11-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void constructor_nullFileName_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((String) null, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void constructor_missingFileName_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e(MISSING_FILE_PATH));","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e(MISSING_FILE_PATH, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void constructor_invalidFileName_throwsAssertionError() {","lastModifiedDate":"2016-12-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(INVALID_FILE_PATH));","lastModifiedDate":"2019-03-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(INVALID_FILE_PATH, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":" private URL getTestFileUrl(String testFilePath) {","lastModifiedDate":"2016-12-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String testFilePathInView \u003d \"/view/\" + testFilePath;","lastModifiedDate":"2016-12-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" URL testFileUrl \u003d MainApp.class.getResource(testFilePathInView);","lastModifiedDate":"2016-12-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertNotNull(testFileUrl, testFilePathInView + \" does not exist.\");","lastModifiedDate":"2019-03-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return testFileUrl;","lastModifiedDate":"2016-12-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * UiPart used for testing.","lastModifiedDate":"2016-12-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * It should only be used with invalid FXML files or the valid file located at {@link VALID_FILE_PATH}.","lastModifiedDate":"2016-12-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" private static class TestUiPart\u003cT\u003e extends UiPart\u003cT\u003e {","lastModifiedDate":"2016-12-21"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private TestFxmlObject validFileRoot; // Check that @FXML annotations work","lastModifiedDate":"2016-12-21"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":94,"author":{"gitId":"-"},"content":" TestUiPart(URL fxmlFileUrl, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":" super(fxmlFileUrl, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":" TestUiPart(String fxmlFileName, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":" super(fxmlFileName, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":" TestUiPart(URL fxmlFileUrl) {","lastModifiedDate":"2016-12-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":" super(fxmlFileUrl);","lastModifiedDate":"2016-12-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, validFileRoot);","lastModifiedDate":"2016-12-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":107,"author":{"gitId":"-"},"content":" TestUiPart(String fxmlFileName) {","lastModifiedDate":"2016-12-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":" super(fxmlFileName);","lastModifiedDate":"2016-12-21"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, validFileRoot);","lastModifiedDate":"2016-12-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"tsulim":3,"-":111}},{"path":"src/test/resources/view/UiPartTest/validFile.fxml","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2016-12-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"\u003c?import staffconnect.ui.TestFxmlObject?\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003cTestFxmlObject xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:id\u003d\"validFileRoot\"\u003eHello World!\u003c/TestFxmlObject\u003e","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"tsulim":1,"-":3}},{"path":"src/test/resources/view/UiPartTest/validFileWithFxRoot.fxml","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2017-11-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":3,"author":{"gitId":"tsulim"},"content":"\u003cfx:root type\u003d\"staffconnect.ui.TestFxmlObject\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2023-07-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003ctext\u003eHello World!\u003c/text\u003e","lastModifiedDate":"2017-11-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2017-11-29"}],"authorContributionMap":{"tsulim":1,"-":5}}] diff --git a/AY2324S2-CS2103-F08-3_tp_master/commits.json b/AY2324S2-CS2103-F08-3_tp_master/commits.json index 0c318620..f1a2a825 100644 --- a/AY2324S2-CS2103-F08-3_tp_master/commits.json +++ b/AY2324S2-CS2103-F08-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"tsulim":[{"date":"2024-03-06","commitResults":[{"hash":"496b682de95e9697ae65e6b6b4263ec8f8386974","isMergeCommit":true,"messageTitle":"Merge pull request #30 from iynixil/update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bba0a78418d5ed6d6e6e6dfcf281f22151aa61b8","isMergeCommit":true,"messageTitle":"Merge pull request #32 from whitesnowx/send-to-teemrepo","messageBody":"Update on DG and AboutUs","fileTypesAndContributionMap":{}},{"hash":"d27f74cea215e1615d54f79ff2599c87277b9e4d","isMergeCommit":false,"messageTitle":"Update aboutus page with my details and photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"36404ac1b986c5ba38e78e40c05a1e18940046ac","isMergeCommit":false,"messageTitle":"Update file names to follow format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"d35422275b62023adb1f849b611fbeca4f0bde11","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Pluiexo/update-readme","messageBody":"Update Readme to fit StaffConnect","fileTypesAndContributionMap":{}},{"hash":"45ee2274d271d6bc4dd4ccf19c2db75de4621326","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Pluiexo/update-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"40035a3c7233fd673b99b36cdad682330f628293","isMergeCommit":true,"messageTitle":"Merge pull request #39 from Pluiexo/branch-update-UG","messageBody":"Update Website Index and UserGuide","fileTypesAndContributionMap":{}}]}],"iynixil":[{"date":"2024-03-06","commitResults":[{"hash":"b69e5d7a0a4211e83bb7a59bc9067b548f1c690c","isMergeCommit":false,"messageTitle":"Update DG: Target user profile, value proposition, user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":14}}},{"hash":"46a6c5a2e602258f9ebc30e40bc4c66d11366619","isMergeCommit":true,"messageTitle":"Merge pull request #29 from whitesnowx/add-calistaWong-info","messageBody":"add calistawong information into about us","fileTypesAndContributionMap":{}},{"hash":"28d30e307842f7cae25a6b05730d82dbff822e32","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"df4173e5996779ec0b3a1ecf59a7904e4f6d93bf","isMergeCommit":false,"messageTitle":"Update AboutUs: Add iynixil","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}],"JerryWang0000":[{"date":"2024-03-06","commitResults":[{"hash":"eabf0a37ba0560b403b570ed80a9da958dd1e175","isMergeCommit":false,"messageTitle":"Update AboutUs for Jerry Wang","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c647c0f81e9742de96f410ee44fffbc1d9914f19","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Add content to NFR and Glossary in Appendix: Requirements.\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"8f808904be57991be391b6c8bdca3439870aa1cc","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Fix some minor typos.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"Pluiexo":[{"date":"2024-02-24","commitResults":[{"hash":"1b288a389a0e1f55e25dd452836bb805c77fa4a2","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"0924dab2e37221f49e3959f250a1b22c8ab7011d","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"102d1016e3cf738f4e30c7ae99801f680dd3a375","isMergeCommit":false,"messageTitle":"Update Readme to fit StaffConnect","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":11}}},{"hash":"06a42be2da3a848cc003441098ce9ee6335e0d5b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from JerryWang0000/update-DeveloperGuide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"5d72703ae863e01cae2520b7edf297e442d5d71b","isMergeCommit":false,"messageTitle":"Update github info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0cdf1eed25dc865abfa0e90cf79f1b23e02b7988","isMergeCommit":false,"messageTitle":"Amend Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":3}}},{"hash":"66fcb566fe9d9f5b49bb7acaf5e3f24714575131","isMergeCommit":false,"messageTitle":"Add pluiexo.md page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}},{"hash":"42482fb8c9eae3c300049f16148e85ef00ce553e","isMergeCommit":false,"messageTitle":"Update website main index","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":6}}},{"hash":"b37a6a411b4bc6cc25420a1ac010c7f23ddd031a","isMergeCommit":false,"messageTitle":"Update UserGuide description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":17}}},{"hash":"bf6fbe50e26b631bc3d4fec22aa8670225e8969f","isMergeCommit":false,"messageTitle":"Fix typos and added clarity","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"whitesnowx":[{"date":"2024-03-06","commitResults":[{"hash":"089a34f600f78b52b02650fd7d490561c10aad61","isMergeCommit":true,"messageTitle":"Merge pull request #28 from iynixil/update-dg","messageBody":"Update DG: Target user profile, value proposition, user stories","fileTypesAndContributionMap":{}},{"hash":"fa5c7a7fd22078d75fb2bb45a69495c1b2644ef4","isMergeCommit":false,"messageTitle":"add calistawong information into about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":6}}},{"hash":"20cf643180fb39468ed2eb5284c9198d8f9f9f38","isMergeCommit":false,"messageTitle":"Updated use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":10}}},{"hash":"ce301ee039801ecc4b73881f225e5ee81e498b17","isMergeCommit":true,"messageTitle":"Merge pull request #31 from JerryWang0000/update-AboutUs-JerryWang","messageBody":"Update AboutUs for Jerry Wang","fileTypesAndContributionMap":{}},{"hash":"100757221b911543e60f4a916cc1c0d5e1d1b6a1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into send-to-teemrepo","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8de755708a437b67433170480eb848fed700b8f7","isMergeCommit":false,"messageTitle":"update aboutus info to name match lowercase requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"a33d0ec96e566e85d6ba142dc9fa76d232c61641","isMergeCommit":false,"messageTitle":"changed names to match github names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"ccf56a16518e8ff9ada9bfdf57190872435071b4","isMergeCommit":false,"messageTitle":"aboutus update file name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3a242712a73c50e666e1ae376f0ba54929cb2ed0","isMergeCommit":false,"messageTitle":"Change use case for filter and typo in sort","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"870493742f147d46aa54ef4f9477ab92e87428ce","isMergeCommit":false,"messageTitle":"Update typos","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d2d947017a127c9b49c204350a92c2d22106d1cb","isMergeCommit":true,"messageTitle":"Merge pull request #33 from tsulim/branch_update_aboutus","messageBody":"Update aboutus page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"tsulim":{"docs":52,"functional-code":0,"test-code":0,"other":1},"iynixil":{"docs":65,"functional-code":0,"test-code":0},"JerryWang0000":{"docs":60,"functional-code":0,"test-code":0},"Pluiexo":{"docs":65,"functional-code":0,"test-code":0},"whitesnowx":{"docs":84,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tsulim":221.95918,"iynixil":502.02548,"JerryWang0000":235.82143,"Pluiexo":1065.6582,"whitesnowx":2101.49},"authorDisplayNameMap":{"tsulim":"CS2103-F08-3 LIM .. JIA","iynixil":"CS2103-F08-3 LI X..INYI","JerryWang0000":"CS2103-F08-3 WANG..HUAI","Pluiexo":"CS2103-F08-3 NORT.. XUN","whitesnowx":"CS2103-F08-3 CALI..PING"}} +{"authorDailyContributionsMap":{"tsulim":[{"date":"2024-03-06","commitResults":[{"hash":"496b682de95e9697ae65e6b6b4263ec8f8386974","isMergeCommit":true,"messageTitle":"Merge pull request #30 from iynixil/update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bba0a78418d5ed6d6e6e6dfcf281f22151aa61b8","isMergeCommit":true,"messageTitle":"Merge pull request #32 from whitesnowx/send-to-teemrepo","messageBody":"Update on DG and AboutUs","fileTypesAndContributionMap":{}},{"hash":"d27f74cea215e1615d54f79ff2599c87277b9e4d","isMergeCommit":false,"messageTitle":"Update aboutus page with my details and photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"36404ac1b986c5ba38e78e40c05a1e18940046ac","isMergeCommit":false,"messageTitle":"Update file names to follow format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"d35422275b62023adb1f849b611fbeca4f0bde11","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Pluiexo/update-readme","messageBody":"Update Readme to fit StaffConnect","fileTypesAndContributionMap":{}},{"hash":"45ee2274d271d6bc4dd4ccf19c2db75de4621326","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Pluiexo/update-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"40035a3c7233fd673b99b36cdad682330f628293","isMergeCommit":true,"messageTitle":"Merge pull request #39 from Pluiexo/branch-update-UG","messageBody":"Update Website Index and UserGuide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"62a3aab4da79dc27d52e2d9f3ec5a5b805ebf666","isMergeCommit":false,"messageTitle":"Refactor package seedu.address to staffconnect in main","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":334,"deletions":334}}},{"hash":"0159a73810563769027594fff5e11ed0d3b09253","isMergeCommit":false,"messageTitle":"Refactor package seedu.address to staffconnect in test","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":435,"deletions":435}}},{"hash":"a63d970624a9feae17d83c2ca132a25bbfbd1337","isMergeCommit":false,"messageTitle":"Update remaining files with traces of seedu.address in test","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":2,"deletions":2}}},{"hash":"742016c57ebef083fccca29ff204822c1ab85c92","isMergeCommit":false,"messageTitle":"Update files with traces of the package name \"seedu.address\" to \"staffconnect\"","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":1,"deletions":1},"docs":{"insertions":14,"deletions":14}}}]}],"iynixil":[{"date":"2024-03-06","commitResults":[{"hash":"b69e5d7a0a4211e83bb7a59bc9067b548f1c690c","isMergeCommit":false,"messageTitle":"Update DG: Target user profile, value proposition, user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":14}}},{"hash":"46a6c5a2e602258f9ebc30e40bc4c66d11366619","isMergeCommit":true,"messageTitle":"Merge pull request #29 from whitesnowx/add-calistaWong-info","messageBody":"add calistawong information into about us","fileTypesAndContributionMap":{}},{"hash":"28d30e307842f7cae25a6b05730d82dbff822e32","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"df4173e5996779ec0b3a1ecf59a7904e4f6d93bf","isMergeCommit":false,"messageTitle":"Update AboutUs: Add iynixil","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}],"JerryWang0000":[{"date":"2024-03-06","commitResults":[{"hash":"eabf0a37ba0560b403b570ed80a9da958dd1e175","isMergeCommit":false,"messageTitle":"Update AboutUs for Jerry Wang","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c647c0f81e9742de96f410ee44fffbc1d9914f19","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Add content to NFR and Glossary in Appendix: Requirements.\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"8f808904be57991be391b6c8bdca3439870aa1cc","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Fix some minor typos.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"Pluiexo":[{"date":"2024-02-24","commitResults":[{"hash":"1b288a389a0e1f55e25dd452836bb805c77fa4a2","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"0924dab2e37221f49e3959f250a1b22c8ab7011d","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"102d1016e3cf738f4e30c7ae99801f680dd3a375","isMergeCommit":false,"messageTitle":"Update Readme to fit StaffConnect","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":11}}},{"hash":"06a42be2da3a848cc003441098ce9ee6335e0d5b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from JerryWang0000/update-DeveloperGuide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"5d72703ae863e01cae2520b7edf297e442d5d71b","isMergeCommit":false,"messageTitle":"Update github info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0cdf1eed25dc865abfa0e90cf79f1b23e02b7988","isMergeCommit":false,"messageTitle":"Amend Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":3}}},{"hash":"66fcb566fe9d9f5b49bb7acaf5e3f24714575131","isMergeCommit":false,"messageTitle":"Add pluiexo.md page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}},{"hash":"42482fb8c9eae3c300049f16148e85ef00ce553e","isMergeCommit":false,"messageTitle":"Update website main index","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":6}}},{"hash":"b37a6a411b4bc6cc25420a1ac010c7f23ddd031a","isMergeCommit":false,"messageTitle":"Update UserGuide description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":17}}},{"hash":"bf6fbe50e26b631bc3d4fec22aa8670225e8969f","isMergeCommit":false,"messageTitle":"Fix typos and added clarity","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-10","commitResults":[{"hash":"0e15fa16fecdbe7a84e155ceea80696839de604a","isMergeCommit":true,"messageTitle":"Merge pull request #54 from tsulim/branch-rename-packages","messageBody":"Rename packages from `seedu.address` to `staffconnect`","fileTypesAndContributionMap":{}}]}],"whitesnowx":[{"date":"2024-03-06","commitResults":[{"hash":"089a34f600f78b52b02650fd7d490561c10aad61","isMergeCommit":true,"messageTitle":"Merge pull request #28 from iynixil/update-dg","messageBody":"Update DG: Target user profile, value proposition, user stories","fileTypesAndContributionMap":{}},{"hash":"fa5c7a7fd22078d75fb2bb45a69495c1b2644ef4","isMergeCommit":false,"messageTitle":"add calistawong information into about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":6}}},{"hash":"20cf643180fb39468ed2eb5284c9198d8f9f9f38","isMergeCommit":false,"messageTitle":"Updated use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":10}}},{"hash":"ce301ee039801ecc4b73881f225e5ee81e498b17","isMergeCommit":true,"messageTitle":"Merge pull request #31 from JerryWang0000/update-AboutUs-JerryWang","messageBody":"Update AboutUs for Jerry Wang","fileTypesAndContributionMap":{}},{"hash":"100757221b911543e60f4a916cc1c0d5e1d1b6a1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into send-to-teemrepo","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8de755708a437b67433170480eb848fed700b8f7","isMergeCommit":false,"messageTitle":"update aboutus info to name match lowercase requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"a33d0ec96e566e85d6ba142dc9fa76d232c61641","isMergeCommit":false,"messageTitle":"changed names to match github names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"ccf56a16518e8ff9ada9bfdf57190872435071b4","isMergeCommit":false,"messageTitle":"aboutus update file name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3a242712a73c50e666e1ae376f0ba54929cb2ed0","isMergeCommit":false,"messageTitle":"Change use case for filter and typo in sort","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"870493742f147d46aa54ef4f9477ab92e87428ce","isMergeCommit":false,"messageTitle":"Update typos","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d2d947017a127c9b49c204350a92c2d22106d1cb","isMergeCommit":true,"messageTitle":"Merge pull request #33 from tsulim/branch_update_aboutus","messageBody":"Update aboutus page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"tsulim":{"docs":66,"functional-code":334,"test-code":437,"other":2},"iynixil":{"docs":65,"functional-code":0,"test-code":0},"JerryWang0000":{"docs":60,"functional-code":0,"test-code":0},"Pluiexo":{"docs":65,"functional-code":0,"test-code":0},"whitesnowx":{"docs":84,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tsulim":136302.53,"iynixil":419.04504,"JerryWang0000":198.6021,"Pluiexo":890.3254,"whitesnowx":1754.1316},"authorDisplayNameMap":{"tsulim":"CS2103-F08-3 LIM .. JIA","iynixil":"CS2103-F08-3 LI X..INYI","JerryWang0000":"CS2103-F08-3 WANG..HUAI","Pluiexo":"CS2103-F08-3 NORT.. XUN","whitesnowx":"CS2103-F08-3 CALI..PING"}} diff --git a/AY2324S2-CS2103T-F13-4_tp_master/authorship.json b/AY2324S2-CS2103T-F13-4_tp_master/authorship.json index 540cfa22..e0d3da97 100644 --- a/AY2324S2-CS2103T-F13-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F13-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"R-Laksh"},"content":"# **ClassMonitor** \u003cbr\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"R-Laksh"},"content":"##### Are you a struggling Teaching Assistant looking for a tool to manange your classroom?","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"R-Laksh"},"content":"##### We have you covered!","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"R-Laksh"},"content":"ClassMonitor can be used for the following: \u003cbr\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"R-Laksh"},"content":"1) Keeping track of your students\u0027 class participation","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"R-Laksh"},"content":"2) Storing your students personal particulars","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"R-Laksh"},"content":"3) Identifying underperforming students ","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"R-Laksh"},"content":" ","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"R-Laksh"},"content":"##### _And more_","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"R-Laksh"},"content":"#### For the detailed documentation of this project, see the **[ClassMonitor User Guide](https://nus-cs2103-ay2324s2.github.io/tp/UserGuide.html)**. ","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"R-Laksh"},"content":"#### It is built off the [AddressBook-Level3 project](https://github.com/nus-cs2103-AY2324S2/tp), simulating the brownfield process of working with an existing codebase.","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"R-Laksh"},"content":"#### This project is a modification of **the se-education.org** initiative. If you would like to find out more, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"R-Laksh":16,"-":4}},{"path":"build.gradle","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"plugins {","lastModifiedDate":"2016-08-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":" id \u0027java\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":" id \u0027checkstyle\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" id \u0027com.github.johnrengelman.shadow\u0027 version \u00277.1.2\u0027","lastModifiedDate":"2022-06-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":" id \u0027application\u0027","lastModifiedDate":"2016-12-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":" id \u0027jacoco\u0027","lastModifiedDate":"2020-08-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"mainClassName \u003d \u0027seedu.address.Main\u0027","lastModifiedDate":"2019-02-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"sourceCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"targetCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"repositories {","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" mavenCentral()","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" maven { url \u0027https://oss.sonatype.org/content/repositories/snapshots/\u0027 }","lastModifiedDate":"2018-04-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"checkstyle {","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" toolVersion \u003d \u002710.2\u0027","lastModifiedDate":"2022-04-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"test {","lastModifiedDate":"2018-03-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" useJUnitPlatform()","lastModifiedDate":"2018-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" finalizedBy jacocoTestReport","lastModifiedDate":"2020-08-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-08-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"task coverage(type: JacocoReport) {","lastModifiedDate":"2020-08-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":" sourceDirectories.from files(sourceSets.main.allSource.srcDirs)","lastModifiedDate":"2020-08-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" classDirectories.from files(sourceSets.main.output)","lastModifiedDate":"2020-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" executionData.from files(jacocoTestReport.executionData)","lastModifiedDate":"2020-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" afterEvaluate {","lastModifiedDate":"2020-08-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" classDirectories.from files(classDirectories.files.collect {","lastModifiedDate":"2020-08-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" fileTree(dir: it, exclude: [\u0027**/*.jar\u0027])","lastModifiedDate":"2020-08-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" })","lastModifiedDate":"2020-08-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" reports {","lastModifiedDate":"2020-08-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" html.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":" xml.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"dependencies {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String jUnitVersion \u003d \u00275.4.0\u0027","lastModifiedDate":"2019-02-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String javaFxVersion \u003d \u002717.0.7\u0027","lastModifiedDate":"2023-07-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":50,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.core\u0027, name: \u0027jackson-databind\u0027, version: \u00272.7.0\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.datatype\u0027, name: \u0027jackson-datatype-jsr310\u0027, version: \u00272.7.4\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" testImplementation group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-api\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" testRuntimeOnly group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-engine\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"shadowJar {","lastModifiedDate":"2016-08-29"},{"lineNumber":69,"author":{"gitId":"c-wenlong"},"content":" archiveFileName \u003d \u0027classmonitor.jar\u0027","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"defaultTasks \u0027clean\u0027, \u0027test\u0027","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"c-wenlong":1,"-":71}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"chiaryan"},"content":"You can reach us at the email `e0959970@u.nus.edu`","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"evedaktyl"},"content":"### Evelyn","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/evedaktyl.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"evedaktyl"},"content":"[[github](https://github.com/evedaktyl)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/evedaktyl.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"chiaryan"},"content":"* Role: Developer","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiaryan"},"content":"* Responsiblity: README","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"chiaryan"},"content":"### Ryan Chia","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/chiaryan.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/chiaryan)]","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/chiaryan.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chiaryan"},"content":"* Role: Developer","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: Create issues","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiaryan"},"content":"### Laksh","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/r-laksh.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/r-laksh)] ","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/r-laksh.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: About Us","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chiaryan"},"content":"### Kai","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/c-wenlong.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/c-wenlong)]","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/c-wenlong.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiaryan"},"content":"[[Personal Website](https://capyscript.super.site/)]","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: UI Design","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"chiaryan"},"content":"### Kwun","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/kwuunnn.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/kwuunnn)]","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/kwuunnn.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: User Stories","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"evedaktyl":2,"chiaryan":27,"-":33}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"evedaktyl"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"kwuunnn"},"content":"|----------|------------------------------------------|---------------------------------------------------|-------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-09"},{"lineNumber":279,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA using the App for the first time | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-09"},{"lineNumber":280,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | add a new student | |","lastModifiedDate":"2024-03-09"},{"lineNumber":281,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | delete a student | remove entries that I no longer need |","lastModifiedDate":"2024-03-09"},{"lineNumber":282,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | find a student by name | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-03-09"},{"lineNumber":283,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | know the majors of my students | understand their learning needs |","lastModifiedDate":"2024-03-09"},{"lineNumber":284,"author":{"gitId":"kwuunnn"},"content":"| `*` | TA | have a personal description of the student | know more about them |","lastModifiedDate":"2024-03-09"},{"lineNumber":285,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | give student stars for class participation | give credit for class participation |","lastModifiedDate":"2024-03-09"},{"lineNumber":286,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | view a student\u0027s participation | gauge their engagement in class |","lastModifiedDate":"2024-03-09"},{"lineNumber":287,"author":{"gitId":"kwuunnn"},"content":"| `*` | TA | sort students based on participation | praise those who have taken initiative and remind those who have not to be more proactive |","lastModifiedDate":"2024-03-09"},{"lineNumber":288,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | tag the students by their TGs | remember which class my students are in |","lastModifiedDate":"2024-03-09"},{"lineNumber":289,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | tag the students by their modules | remember which module my students are in |","lastModifiedDate":"2024-03-09"},{"lineNumber":290,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | filter the students by their TGs | view all the students from a TG |","lastModifiedDate":"2024-03-09"},{"lineNumber":291,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | filter students by their modules | view all the students from a module |","lastModifiedDate":"2024-03-09"},{"lineNumber":292,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | identify underperforming students with bad grades | intervene and help them |","lastModifiedDate":"2024-03-09"},{"lineNumber":293,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | check who\u0027s work I havent graded yet | remember to do so |","lastModifiedDate":"2024-03-09"},{"lineNumber":294,"author":{"gitId":"kwuunnn"},"content":"| `* * ` | TA | exit the program | |","lastModifiedDate":"2024-03-09"},{"lineNumber":295,"author":{"gitId":"kwuunnn"},"content":"| `* ` | TA | clear all students\u0027 details | remove all entries quickly |","lastModifiedDate":"2024-03-09"},{"lineNumber":296,"author":{"gitId":"kwuunnn"},"content":"| `*` | TA with many persons in the address book | sort students by name | locate a student easily |","lastModifiedDate":"2024-03-09"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"kwuunnn"},"content":"(For all use cases below, the **System** is the `ClassMonitor` and the **Actor** is the `TA`, unless specified otherwise)","lastModifiedDate":"2024-03-09"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"kwuunnn"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":309,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":310,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to delete a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":311,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor deletes the student","lastModifiedDate":"2024-03-09"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"kwuunnn"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":328,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":329,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":330,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":331,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to add a student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":332,"author":{"gitId":"kwuunnn"},"content":"2. TA includes the relevant student\u0027s info ","lastModifiedDate":"2024-03-09"},{"lineNumber":333,"author":{"gitId":"kwuunnn"},"content":"3. ClassMonitor adds the student","lastModifiedDate":"2024-03-09"},{"lineNumber":334,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":335,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":336,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":337,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":338,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":339,"author":{"gitId":"kwuunnn"},"content":"* 2a. TA did not follow the correct format as stated in the instructions.","lastModifiedDate":"2024-03-09"},{"lineNumber":340,"author":{"gitId":"kwuunnn"},"content":" * 2a1. ClassMonitor shows an error message. ","lastModifiedDate":"2024-03-09"},{"lineNumber":341,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":342,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":343,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":344,"author":{"gitId":"kwuunnn"},"content":"**Use case: Add a tag to a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":345,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":346,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":347,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":348,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":349,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":350,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to add a tag to a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":351,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor adds the tag","lastModifiedDate":"2024-03-09"},{"lineNumber":352,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":353,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":354,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":355,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":356,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":357,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":358,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":359,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":360,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":361,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-09"},{"lineNumber":362,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":363,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":364,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":365,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":366,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":367,"author":{"gitId":"kwuunnn"},"content":"**Use case: Find a student by name**","lastModifiedDate":"2024-03-09"},{"lineNumber":368,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":369,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":370,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":371,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":372,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":373,"author":{"gitId":"kwuunnn"},"content":"3. TA searches a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":374,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor returns the specific student\u0027s details","lastModifiedDate":"2024-03-09"},{"lineNumber":375,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":376,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":377,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":378,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":379,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":380,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":381,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":382,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":383,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":384,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given keyword does not match any student\u0027s name.","lastModifiedDate":"2024-03-09"},{"lineNumber":385,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":386,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":387,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":388,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":389,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":390,"author":{"gitId":"kwuunnn"},"content":"**Use case: Add a star to a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":391,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":392,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":393,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":394,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":395,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":396,"author":{"gitId":"kwuunnn"},"content":"3. TA adds a star to a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":397,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor adds a star to the student","lastModifiedDate":"2024-03-09"},{"lineNumber":398,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":399,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":400,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":401,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":402,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":403,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":404,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":405,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":406,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":407,"author":{"gitId":"kwuunnn"},"content":"**Use case: Filter students by tag**","lastModifiedDate":"2024-03-09"},{"lineNumber":408,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":409,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":410,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":411,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":412,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":413,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to filter students by a specific tag","lastModifiedDate":"2024-03-09"},{"lineNumber":414,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor shows a filtered list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":415,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":416,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":417,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":418,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":419,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":420,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":421,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":422,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given tag does not exist.","lastModifiedDate":"2024-03-09"},{"lineNumber":423,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":424,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":425,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":426,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":427,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":428,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":429,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":430,"author":{"gitId":"kwuunnn"},"content":"**Use case: Sort list of students by parameter**","lastModifiedDate":"2024-03-09"},{"lineNumber":431,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":432,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":433,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":434,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":435,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":436,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to sort students by a specific parameter in ascending/descending order","lastModifiedDate":"2024-03-09"},{"lineNumber":437,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor shows a sorted list of students.","lastModifiedDate":"2024-03-09"},{"lineNumber":438,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":439,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":440,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":441,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":442,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":443,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":444,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":445,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given parameter does not exist.","lastModifiedDate":"2024-03-09"},{"lineNumber":446,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":447,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":448,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":449,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":450,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":451,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. ","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"evedaktyl"},"content":"4. All user operations should be completed within 100 milliseconds.","lastModifiedDate":"2024-03-09"},{"lineNumber":459,"author":{"gitId":"evedaktyl"},"content":"5. The project must adhere to a bi-weekly iterative development schedule, ensuring continuous delivery or improvement of a working product every two weeks.","lastModifiedDate":"2024-03-09"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS ","lastModifiedDate":"2024-02-09"},{"lineNumber":464,"author":{"gitId":"evedaktyl"},"content":"* * **Course**: A course with a program and syllabus. e.g. CS2030S","lastModifiedDate":"2024-03-09"},{"lineNumber":465,"author":{"gitId":"evedaktyl"},"content":"* **Tutorial Group (TG)**: A group of students from a particular course. e.g. G13","lastModifiedDate":"2024-03-09"},{"lineNumber":466,"author":{"gitId":"evedaktyl"},"content":"* **Teaching Assistant (TA)**: A tutor attached to class","lastModifiedDate":"2024-03-09"},{"lineNumber":467,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"evedaktyl":6,"kwuunnn":151,"-":361}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chiaryan"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F13-4/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F13-4/tp/actions)","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"R-Laksh"},"content":"# **ClassMonitor** \u003cbr\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"R-Laksh"},"content":"##### Are you a struggling Teaching Assistant looking for a tool to manange your classroom?","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"R-Laksh"},"content":"##### We have you covered!","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"R-Laksh"},"content":"ClassMonitor can be used for the following: \u003cbr\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"R-Laksh"},"content":"1) Keeping track of your students\u0027 class participation","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"R-Laksh"},"content":"2) Storing your students personal particulars","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"R-Laksh"},"content":"3) Identifying underperforming students ","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"R-Laksh"},"content":" ","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"R-Laksh"},"content":"##### _And more_","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"R-Laksh"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"R-Laksh"},"content":"#### For the detailed documentation of this project, see the **[ClassMonitor User Guide](https://nus-cs2103-ay2324s2.github.io/tp/UserGuide.html)**. ","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"R-Laksh"},"content":"#### It is built off the [AddressBook-Level3 project](https://github.com/nus-cs2103-AY2324S2/tp), simulating the brownfield process of working with an existing codebase.","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"R-Laksh"},"content":"#### This project is a modification of **the se-education.org** initiative. If you would like to find out more, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"R-Laksh":16,"chiaryan":1,"-":3}},{"path":"build.gradle","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"plugins {","lastModifiedDate":"2016-08-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":" id \u0027java\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":" id \u0027checkstyle\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" id \u0027com.github.johnrengelman.shadow\u0027 version \u00277.1.2\u0027","lastModifiedDate":"2022-06-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":" id \u0027application\u0027","lastModifiedDate":"2016-12-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":" id \u0027jacoco\u0027","lastModifiedDate":"2020-08-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"mainClassName \u003d \u0027seedu.address.Main\u0027","lastModifiedDate":"2019-02-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"sourceCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"targetCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"repositories {","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" mavenCentral()","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" maven { url \u0027https://oss.sonatype.org/content/repositories/snapshots/\u0027 }","lastModifiedDate":"2018-04-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"checkstyle {","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" toolVersion \u003d \u002710.2\u0027","lastModifiedDate":"2022-04-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"test {","lastModifiedDate":"2018-03-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" useJUnitPlatform()","lastModifiedDate":"2018-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" finalizedBy jacocoTestReport","lastModifiedDate":"2020-08-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-08-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"task coverage(type: JacocoReport) {","lastModifiedDate":"2020-08-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":" sourceDirectories.from files(sourceSets.main.allSource.srcDirs)","lastModifiedDate":"2020-08-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" classDirectories.from files(sourceSets.main.output)","lastModifiedDate":"2020-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" executionData.from files(jacocoTestReport.executionData)","lastModifiedDate":"2020-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" afterEvaluate {","lastModifiedDate":"2020-08-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" classDirectories.from files(classDirectories.files.collect {","lastModifiedDate":"2020-08-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" fileTree(dir: it, exclude: [\u0027**/*.jar\u0027])","lastModifiedDate":"2020-08-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" })","lastModifiedDate":"2020-08-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" reports {","lastModifiedDate":"2020-08-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" html.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":" xml.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"dependencies {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String jUnitVersion \u003d \u00275.4.0\u0027","lastModifiedDate":"2019-02-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String javaFxVersion \u003d \u002717.0.7\u0027","lastModifiedDate":"2023-07-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":50,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.core\u0027, name: \u0027jackson-databind\u0027, version: \u00272.7.0\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.datatype\u0027, name: \u0027jackson-datatype-jsr310\u0027, version: \u00272.7.4\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" testImplementation group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-api\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" testRuntimeOnly group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-engine\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"shadowJar {","lastModifiedDate":"2016-08-29"},{"lineNumber":69,"author":{"gitId":"c-wenlong"},"content":" archiveFileName \u003d \u0027classmonitor.jar\u0027","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"defaultTasks \u0027clean\u0027, \u0027test\u0027","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"c-wenlong":1,"-":71}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"chiaryan"},"content":"You can reach us at the email `e0959970@u.nus.edu`","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"evedaktyl"},"content":"### Evelyn","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/evedaktyl.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"evedaktyl"},"content":"[[github](https://github.com/evedaktyl)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/evedaktyl.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"chiaryan"},"content":"* Role: Developer","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiaryan"},"content":"* Responsiblity: README","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"chiaryan"},"content":"### Ryan Chia","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/chiaryan.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/chiaryan)]","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/chiaryan.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chiaryan"},"content":"* Role: Developer","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: Create issues","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiaryan"},"content":"### Laksh","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/r-laksh.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/r-laksh)] ","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/r-laksh.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: About Us","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chiaryan"},"content":"### Kai","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/c-wenlong.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/c-wenlong)]","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/c-wenlong.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiaryan"},"content":"[[Personal Website](https://capyscript.super.site/)]","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: UI Design","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"chiaryan"},"content":"### Kwun","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"chiaryan"},"content":"\u003cimg src\u003d\"images/kwuunnn.png\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"chiaryan"},"content":"[[github](http://github.com/kwuunnn)]","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiaryan"},"content":"[[portfolio](team/kwuunnn.md)]","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"chiaryan"},"content":"* Responsibilities: User Stories","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"evedaktyl":2,"chiaryan":27,"-":33}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"evedaktyl"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"chiaryan"},"content":"* Teaching Assistant (TA) who is responsible for managing classes of students","lastModifiedDate":"2024-03-10"},{"lineNumber":265,"author":{"gitId":"chiaryan"},"content":"* Has a need to track class participation across students","lastModifiedDate":"2024-03-10"},{"lineNumber":266,"author":{"gitId":"chiaryan"},"content":"* prefers desktop apps on a laptop","lastModifiedDate":"2024-03-10"},{"lineNumber":267,"author":{"gitId":"chiaryan"},"content":"* prefers typing in a CLI interface to mouse interactions","lastModifiedDate":"2024-03-10"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"kwuunnn"},"content":"|----------|------------------------------------------|---------------------------------------------------|-------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-09"},{"lineNumber":278,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA using the App for the first time | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-09"},{"lineNumber":279,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | add a new student | |","lastModifiedDate":"2024-03-09"},{"lineNumber":280,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | delete a student | remove entries that I no longer need |","lastModifiedDate":"2024-03-09"},{"lineNumber":281,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | find a student by name | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-03-09"},{"lineNumber":282,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | know the majors of my students | understand their learning needs |","lastModifiedDate":"2024-03-09"},{"lineNumber":283,"author":{"gitId":"kwuunnn"},"content":"| `*` | TA | have a personal description of the student | know more about them |","lastModifiedDate":"2024-03-09"},{"lineNumber":284,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | give student stars for class participation | give credit for class participation |","lastModifiedDate":"2024-03-09"},{"lineNumber":285,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | view a student\u0027s participation | gauge their engagement in class |","lastModifiedDate":"2024-03-09"},{"lineNumber":286,"author":{"gitId":"kwuunnn"},"content":"| `*` | TA | sort students based on participation | praise those who have taken initiative and remind those who have not to be more proactive |","lastModifiedDate":"2024-03-09"},{"lineNumber":287,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | tag the students by their TGs | remember which class my students are in |","lastModifiedDate":"2024-03-09"},{"lineNumber":288,"author":{"gitId":"kwuunnn"},"content":"| `* * *` | TA | tag the students by their modules | remember which module my students are in |","lastModifiedDate":"2024-03-09"},{"lineNumber":289,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | filter the students by their TGs | view all the students from a TG |","lastModifiedDate":"2024-03-09"},{"lineNumber":290,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | filter students by their modules | view all the students from a module |","lastModifiedDate":"2024-03-09"},{"lineNumber":291,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | identify underperforming students with bad grades | intervene and help them |","lastModifiedDate":"2024-03-09"},{"lineNumber":292,"author":{"gitId":"kwuunnn"},"content":"| `* *` | TA | check who\u0027s work I havent graded yet | remember to do so |","lastModifiedDate":"2024-03-09"},{"lineNumber":293,"author":{"gitId":"kwuunnn"},"content":"| `* * ` | TA | exit the program | |","lastModifiedDate":"2024-03-09"},{"lineNumber":294,"author":{"gitId":"kwuunnn"},"content":"| `* ` | TA | clear all students\u0027 details | remove all entries quickly |","lastModifiedDate":"2024-03-09"},{"lineNumber":295,"author":{"gitId":"kwuunnn"},"content":"| `*` | TA with many persons in the address book | sort students by name | locate a student easily |","lastModifiedDate":"2024-03-09"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"kwuunnn"},"content":"(For all use cases below, the **System** is the `ClassMonitor` and the **Actor** is the `TA`, unless specified otherwise)","lastModifiedDate":"2024-03-09"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"kwuunnn"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":308,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":309,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to delete a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":310,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor deletes the student","lastModifiedDate":"2024-03-09"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"kwuunnn"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":327,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":328,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":329,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":330,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to add a student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":331,"author":{"gitId":"kwuunnn"},"content":"2. TA includes the relevant student\u0027s info ","lastModifiedDate":"2024-03-09"},{"lineNumber":332,"author":{"gitId":"kwuunnn"},"content":"3. ClassMonitor adds the student","lastModifiedDate":"2024-03-09"},{"lineNumber":333,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":334,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":335,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":336,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":337,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":338,"author":{"gitId":"kwuunnn"},"content":"* 2a. TA did not follow the correct format as stated in the instructions.","lastModifiedDate":"2024-03-09"},{"lineNumber":339,"author":{"gitId":"kwuunnn"},"content":" * 2a1. ClassMonitor shows an error message. ","lastModifiedDate":"2024-03-09"},{"lineNumber":340,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":341,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":342,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":343,"author":{"gitId":"kwuunnn"},"content":"**Use case: Add a tag to a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":344,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":345,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":346,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":347,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":348,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":349,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to add a tag to a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":350,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor adds the tag","lastModifiedDate":"2024-03-09"},{"lineNumber":351,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":352,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":353,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":354,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":355,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":356,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":357,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":358,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":359,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":360,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-09"},{"lineNumber":361,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":362,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":363,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":364,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":365,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":366,"author":{"gitId":"kwuunnn"},"content":"**Use case: Find a student by name**","lastModifiedDate":"2024-03-09"},{"lineNumber":367,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":368,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":369,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":370,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":371,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":372,"author":{"gitId":"kwuunnn"},"content":"3. TA searches a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":373,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor returns the specific student\u0027s details","lastModifiedDate":"2024-03-09"},{"lineNumber":374,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":375,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":376,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":377,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":378,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":379,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":380,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":381,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":382,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":383,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given keyword does not match any student\u0027s name.","lastModifiedDate":"2024-03-09"},{"lineNumber":384,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":385,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":386,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":387,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":388,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":389,"author":{"gitId":"kwuunnn"},"content":"**Use case: Add a star to a student**","lastModifiedDate":"2024-03-09"},{"lineNumber":390,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":391,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":392,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":393,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":394,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":395,"author":{"gitId":"kwuunnn"},"content":"3. TA adds a star to a specific student in the list","lastModifiedDate":"2024-03-09"},{"lineNumber":396,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor adds a star to the student","lastModifiedDate":"2024-03-09"},{"lineNumber":397,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":398,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":399,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":400,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":401,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":402,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":403,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":404,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":405,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":406,"author":{"gitId":"kwuunnn"},"content":"**Use case: Filter students by tag**","lastModifiedDate":"2024-03-09"},{"lineNumber":407,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":408,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":409,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":410,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":411,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":412,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to filter students by a specific tag","lastModifiedDate":"2024-03-09"},{"lineNumber":413,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor shows a filtered list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":414,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":415,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":416,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":417,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":418,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":419,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":420,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":421,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given tag does not exist.","lastModifiedDate":"2024-03-09"},{"lineNumber":422,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":423,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":424,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":425,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":426,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":427,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":428,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":429,"author":{"gitId":"kwuunnn"},"content":"**Use case: Sort list of students by parameter**","lastModifiedDate":"2024-03-09"},{"lineNumber":430,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":431,"author":{"gitId":"kwuunnn"},"content":"**MSS**","lastModifiedDate":"2024-03-09"},{"lineNumber":432,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":433,"author":{"gitId":"kwuunnn"},"content":"1. TA requests to list students","lastModifiedDate":"2024-03-09"},{"lineNumber":434,"author":{"gitId":"kwuunnn"},"content":"2. ClassMonitor shows a list of students","lastModifiedDate":"2024-03-09"},{"lineNumber":435,"author":{"gitId":"kwuunnn"},"content":"3. TA requests to sort students by a specific parameter in ascending/descending order","lastModifiedDate":"2024-03-09"},{"lineNumber":436,"author":{"gitId":"kwuunnn"},"content":"4. ClassMonitor shows a sorted list of students.","lastModifiedDate":"2024-03-09"},{"lineNumber":437,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":438,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":439,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":440,"author":{"gitId":"kwuunnn"},"content":"**Extensions**","lastModifiedDate":"2024-03-09"},{"lineNumber":441,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":442,"author":{"gitId":"kwuunnn"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-09"},{"lineNumber":443,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":444,"author":{"gitId":"kwuunnn"},"content":"* 3a. The given parameter does not exist.","lastModifiedDate":"2024-03-09"},{"lineNumber":445,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":446,"author":{"gitId":"kwuunnn"},"content":" * 3a1. ClassMonitor shows an error message.","lastModifiedDate":"2024-03-09"},{"lineNumber":447,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":448,"author":{"gitId":"kwuunnn"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-09"},{"lineNumber":449,"author":{"gitId":"kwuunnn"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":450,"author":{"gitId":"kwuunnn"},"content":" Use case ends.","lastModifiedDate":"2024-03-09"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. ","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"evedaktyl"},"content":"4. All user operations should be completed within 100 milliseconds.","lastModifiedDate":"2024-03-09"},{"lineNumber":458,"author":{"gitId":"evedaktyl"},"content":"5. The project must adhere to a bi-weekly iterative development schedule, ensuring continuous delivery or improvement of a working product every two weeks.","lastModifiedDate":"2024-03-09"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS ","lastModifiedDate":"2024-02-09"},{"lineNumber":463,"author":{"gitId":"evedaktyl"},"content":"* * **Course**: A course with a program and syllabus. e.g. CS2030S","lastModifiedDate":"2024-03-09"},{"lineNumber":464,"author":{"gitId":"evedaktyl"},"content":"* **Tutorial Group (TG)**: A group of students from a particular course. e.g. G13","lastModifiedDate":"2024-03-09"},{"lineNumber":465,"author":{"gitId":"evedaktyl"},"content":"* **Teaching Assistant (TA)**: A tutor attached to class","lastModifiedDate":"2024-03-09"},{"lineNumber":466,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"evedaktyl":6,"kwuunnn":151,"chiaryan":4,"-":356}}] diff --git a/AY2324S2-CS2103T-F13-4_tp_master/commits.json b/AY2324S2-CS2103T-F13-4_tp_master/commits.json index e09cabb9..4aa47c57 100644 --- a/AY2324S2-CS2103T-F13-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-F13-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"evedaktyl":[{"date":"2024-03-07","commitResults":[{"hash":"d1db6f34ca35fab4f46ee8286569c12374f18c5c","isMergeCommit":false,"messageTitle":"Add profile picture to project website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]},{"date":"2024-03-09","commitResults":[{"hash":"96c1aeeddce98d1feb3aba3ef17a9dd1d2ec1928","isMergeCommit":false,"messageTitle":"Add NFRs to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"7d772e631445c9d7f0aa05b6a5493eb30633c236","isMergeCommit":false,"messageTitle":"Update glossary terms","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"cb9cbff0196dcd827779de93b0c4ad63990c7ede","isMergeCommit":false,"messageTitle":"Add tutorial group to glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"R-Laksh":[{"date":"2024-03-09","commitResults":[{"hash":"0aad1f3b6a5cc3b0a3f857dde05cecdb90b918c2","isMergeCommit":false,"messageTitle":"Update AB-3 README for ClassMonitor","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":10}}},{"hash":"7ce78c6be9d52943f5aa3ea2c7ab2242eed17332","isMergeCommit":false,"messageTitle":"Add reference to AB-3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]}],"kwuunnn":[{"date":"2024-03-09","commitResults":[{"hash":"d8e8e57b6ac3ce45939ff89d0b23ce610ea334c0","isMergeCommit":false,"messageTitle":"Update User Stories and Use Cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":152,"deletions":16}}}]}],"chiaryan":[{"date":"2024-03-09","commitResults":[{"hash":"da0856fab21969cfd1db47a62e4b2d85de9da185","isMergeCommit":true,"messageTitle":"Merge pull request #9 from evedaktyl/update-project-website","messageBody":"Add profile picture to project website","fileTypesAndContributionMap":{}},{"hash":"19e2a70cc6511d9fe08ab6b6b1acceddf907ebd0","isMergeCommit":false,"messageTitle":"Update AboutUs.md with images","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":21}}},{"hash":"7141f073afc1a41eabc2771065654ca7877cb3f6","isMergeCommit":true,"messageTitle":"Merge pull request #12 from chiaryan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"a1e5232a717a72487a92886597942014e0482144","isMergeCommit":false,"messageTitle":"Adjust image sizes in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":10}}},{"hash":"bf29eafc3d9c09eec5fb875cc3bafe53c222e945","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kwuunnn/userStories-useCases","messageBody":"Update User Stories and Use Cases","fileTypesAndContributionMap":{}}]}],"c-wenlong":[{"date":"2024-02-25","commitResults":[{"hash":"76aa0c3b575ab6c0b95fca6e75076412d026a73e","isMergeCommit":false,"messageTitle":"First commit, update build name in build.gradle","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-09","commitResults":[{"hash":"4fa1adaa39bb549cabc89f711a93f1abed090ff8","isMergeCommit":true,"messageTitle":"Merge pull request #10 from evedaktyl/add-NFR-Glossary","messageBody":"Add NFRs to developer guide","fileTypesAndContributionMap":{}},{"hash":"e50b6e61e25ef98b2651fd6c94120b3c73867a9e","isMergeCommit":true,"messageTitle":"Merge pull request #14 from chiaryan/update-aboutus","messageBody":"Adjust image sizes in AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"1029891904b30828126d3649b55c953c31acfe36","isMergeCommit":true,"messageTitle":"Merge pull request #13 from R-Laksh/update-project-readme","messageBody":"Update project readme","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"evedaktyl":{"docs":8,"functional-code":0,"test-code":0},"R-Laksh":{"docs":16,"functional-code":0,"test-code":0},"kwuunnn":{"docs":151,"functional-code":0,"test-code":0},"chiaryan":{"docs":27,"functional-code":0,"test-code":0},"c-wenlong":{"docs":0,"functional-code":0,"test-code":0,"other":1}},"authorContributionVariance":{"evedaktyl":21.609375,"R-Laksh":45.9375,"kwuunnn":1653.75,"chiaryan":247.5586,"c-wenlong":0.234375},"authorDisplayNameMap":{"evedaktyl":"CS2103T-F13-4 EVEL..N EN","R-Laksh":"CS2103T-F13-4 RAMU..ANAN","kwuunnn":"CS2103T-F13-4 CHIN.. HEI","chiaryan":"CS2103T-F13-4 CHIA..RYAN","c-wenlong":"CS2103T-F13-4 CHEN..LONG"}} +{"authorDailyContributionsMap":{"evedaktyl":[{"date":"2024-03-07","commitResults":[{"hash":"d1db6f34ca35fab4f46ee8286569c12374f18c5c","isMergeCommit":false,"messageTitle":"Add profile picture to project website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]},{"date":"2024-03-09","commitResults":[{"hash":"96c1aeeddce98d1feb3aba3ef17a9dd1d2ec1928","isMergeCommit":false,"messageTitle":"Add NFRs to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"7d772e631445c9d7f0aa05b6a5493eb30633c236","isMergeCommit":false,"messageTitle":"Update glossary terms","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"cb9cbff0196dcd827779de93b0c4ad63990c7ede","isMergeCommit":false,"messageTitle":"Add tutorial group to glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"R-Laksh":[{"date":"2024-03-09","commitResults":[{"hash":"0aad1f3b6a5cc3b0a3f857dde05cecdb90b918c2","isMergeCommit":false,"messageTitle":"Update AB-3 README for ClassMonitor","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":10}}},{"hash":"7ce78c6be9d52943f5aa3ea2c7ab2242eed17332","isMergeCommit":false,"messageTitle":"Add reference to AB-3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]}],"kwuunnn":[{"date":"2024-03-09","commitResults":[{"hash":"d8e8e57b6ac3ce45939ff89d0b23ce610ea334c0","isMergeCommit":false,"messageTitle":"Update User Stories and Use Cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":152,"deletions":16}}}]},{"date":"2024-03-10","commitResults":[{"hash":"70dbefc6a3891657cabdecbd242330ad4764950b","isMergeCommit":true,"messageTitle":"Merge pull request #21 from chiaryan/passing-week-7","messageBody":"Fixes to pass week 7 checks","fileTypesAndContributionMap":{}}]}],"chiaryan":[{"date":"2024-03-09","commitResults":[{"hash":"da0856fab21969cfd1db47a62e4b2d85de9da185","isMergeCommit":true,"messageTitle":"Merge pull request #9 from evedaktyl/update-project-website","messageBody":"Add profile picture to project website","fileTypesAndContributionMap":{}},{"hash":"19e2a70cc6511d9fe08ab6b6b1acceddf907ebd0","isMergeCommit":false,"messageTitle":"Update AboutUs.md with images","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":21}}},{"hash":"7141f073afc1a41eabc2771065654ca7877cb3f6","isMergeCommit":true,"messageTitle":"Merge pull request #12 from chiaryan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"a1e5232a717a72487a92886597942014e0482144","isMergeCommit":false,"messageTitle":"Adjust image sizes in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":10}}},{"hash":"bf29eafc3d9c09eec5fb875cc3bafe53c222e945","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kwuunnn/userStories-useCases","messageBody":"Update User Stories and Use Cases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"126f0aec3f8511e5768b887c725afeafb36bb45e","isMergeCommit":false,"messageTitle":"Change CI badge to point towards team URL","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0fe17a857f88a7884f36594e23985940b087d48d","isMergeCommit":false,"messageTitle":"DG: Update User profile to match TA","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}}]}],"c-wenlong":[{"date":"2024-02-25","commitResults":[{"hash":"76aa0c3b575ab6c0b95fca6e75076412d026a73e","isMergeCommit":false,"messageTitle":"First commit, update build name in build.gradle","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-09","commitResults":[{"hash":"4fa1adaa39bb549cabc89f711a93f1abed090ff8","isMergeCommit":true,"messageTitle":"Merge pull request #10 from evedaktyl/add-NFR-Glossary","messageBody":"Add NFRs to developer guide","fileTypesAndContributionMap":{}},{"hash":"e50b6e61e25ef98b2651fd6c94120b3c73867a9e","isMergeCommit":true,"messageTitle":"Merge pull request #14 from chiaryan/update-aboutus","messageBody":"Adjust image sizes in AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"1029891904b30828126d3649b55c953c31acfe36","isMergeCommit":true,"messageTitle":"Merge pull request #13 from R-Laksh/update-project-readme","messageBody":"Update project readme","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"evedaktyl":{"docs":8,"functional-code":0,"test-code":0},"R-Laksh":{"docs":16,"functional-code":0,"test-code":0},"kwuunnn":{"docs":151,"functional-code":0,"test-code":0},"chiaryan":{"docs":32,"functional-code":0,"test-code":0},"c-wenlong":{"docs":0,"functional-code":0,"test-code":0,"other":1}},"authorContributionVariance":{"evedaktyl":20.48443,"R-Laksh":43.404846,"kwuunnn":1562.5743,"chiaryan":235.6609,"c-wenlong":0.22145335},"authorDisplayNameMap":{"evedaktyl":"CS2103T-F13-4 EVEL..N EN","R-Laksh":"CS2103T-F13-4 RAMU..ANAN","kwuunnn":"CS2103T-F13-4 CHIN.. HEI","chiaryan":"CS2103T-F13-4 CHIA..RYAN","c-wenlong":"CS2103T-F13-4 CHEN..LONG"}} diff --git a/AY2324S2-CS2103T-T08-3_tp_master/authorship.json b/AY2324S2-CS2103T-T08-3_tp_master/authorship.json index 0a8413ee..a97c13d6 100644 --- a/AY2324S2-CS2103T-T08-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T08-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ZHANGTIANYAO1"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/tp/graph/badge.svg?token\u003d0RG4SRDBHW)](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* This is **a project for Computer professional job seekers**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage job applications","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage contacts of recruiters and interviewers","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* The project simulates an ongoing software project for a desktop application (called _CareerConnect Bot_) used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* It is named `CareerConnect Bot` (`CCBot` for short), it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"}],"authorContributionMap":{"ZHANGTIANYAO1":7,"-":10}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"dabzpengu"},"content":"### Mahathir Norrahim","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"dabzpengu"},"content":"\u003cimg src\u003d\"images/gandalf.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"dabzpengu"},"content":"[[github](https://github.com/dabzpengu)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"dabzpengu"},"content":"* Responsibilities: UI / Quality Assurance","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"Lalelulilulela"},"content":"### Tan Yi Jing","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Lalelulilulela"},"content":"\u003cimg src\u003d\"images/lalelulilulela.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Lalelulilulela"},"content":"[[github](http://github.com/Lalelulilulela)] [[portfolio](team/Lalelulilulela.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Dexter-Wong"},"content":"### Dexter Wong","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Dexter-Wong"},"content":"\u003cimg src\u003d\"images/dexter.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"Dexter-Wong"},"content":"[[github](http://github.com/Dexter-Wong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"Dexter-Wong"},"content":"[[portfolio](team/dexter.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Lalelulilulela":3,"dabzpengu":4,"-":47,"Dexter-Wong":4}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"Lalelulilulela"},"content":"* computing professionals looking for job openings","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"Lalelulilulela"},"content":"* has a need to manage a significant number of company contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Lalelulilulela":2,"-":381}},{"path":"docs/team/dexter.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Dexter-Wong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Dexter-Wong"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Dexter-Wong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Dexter-Wong"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Dexter-Wong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Dexter-Wong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Dexter-Wong"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Dexter-Wong"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Dexter-Wong"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Dexter-Wong"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Dexter-Wong"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Dexter-Wong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Dexter-Wong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Dexter-Wong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Dexter-Wong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Dexter-Wong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Dexter-Wong"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Dexter-Wong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Dexter-Wong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Dexter-Wong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Dexter-Wong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Dexter-Wong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Dexter-Wong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Dexter-Wong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Dexter-Wong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Dexter-Wong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Dexter-Wong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Dexter-Wong"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"Dexter-Wong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Dexter-Wong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Dexter-Wong":46}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ZHANGTIANYAO1"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/tp/graph/badge.svg?token\u003d0RG4SRDBHW)](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* This is **a project for Computer professional job seekers**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage job applications","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage contacts of recruiters and interviewers","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* The project simulates an ongoing software project for a desktop application (called _CareerConnect Bot_) used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* It is named `CareerConnect Bot` (`CCBot` for short), it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"}],"authorContributionMap":{"ZHANGTIANYAO1":7,"-":10}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"ZHANGTIANYAO1"},"content":"### Zhang Tianyao","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"ZHANGTIANYAO1"},"content":"\u003cimg src\u003d\"images/zhangtianyao1.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"ZHANGTIANYAO1"},"content":"[[homepage](https://github.com/ZHANGTIANYAO1)]","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"ZHANGTIANYAO1"},"content":"[[github](https://github.com/ZHANGTIANYAO1)]","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"ZHANGTIANYAO1"},"content":"[[portfolio](team/zhangtianyao.md)]","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"dabzpengu"},"content":"### Mahathir Norrahim","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"dabzpengu"},"content":"\u003cimg src\u003d\"images/gandalf.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"dabzpengu"},"content":"[[github](https://github.com/dabzpengu)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"dabzpengu"},"content":"* Responsibilities: UI / Quality Assurance","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"Lalelulilulela"},"content":"### Tan Yi Jing","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Lalelulilulela"},"content":"\u003cimg src\u003d\"images/lalelulilulela.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Lalelulilulela"},"content":"[[github](http://github.com/Lalelulilulela)] [[portfolio](team/Lalelulilulela.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Dexter-Wong"},"content":"### Dexter Wong","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Dexter-Wong"},"content":"\u003cimg src\u003d\"images/dexter.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"Dexter-Wong"},"content":"[[github](http://github.com/Dexter-Wong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"Dexter-Wong"},"content":"[[portfolio](team/dexter.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ZHANGTIANYAO1":5,"Lalelulilulela":3,"dabzpengu":4,"-":42,"Dexter-Wong":4}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"Lalelulilulela"},"content":"* computing professionals looking for job openings","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"Lalelulilulela"},"content":"* has a need to manage a significant number of company contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"ZHANGTIANYAO1"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"ZHANGTIANYAO1"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Use case: Add a Contact with Detailed Information**","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"ZHANGTIANYAO1"},"content":"1. The user decides to add a new contact to their address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"ZHANGTIANYAO1"},"content":"2. The user inputs the add command followed by the contact\u0027s details in the format: add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]….","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"ZHANGTIANYAO1"},"content":"3. CCBot validates the input details.","lastModifiedDate":"2024-03-10"},{"lineNumber":329,"author":{"gitId":"ZHANGTIANYAO1"},"content":"4. CCBot adds the new contact to the address book, assigning it a unique identifier within the system.","lastModifiedDate":"2024-03-10"},{"lineNumber":330,"author":{"gitId":"ZHANGTIANYAO1"},"content":"5. CCBot displays a confirmation message to the user indicating the successful addition of the new contact.","lastModifiedDate":"2024-03-10"},{"lineNumber":331,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* 3a. If the user enters invalid details (e.g., incorrect format, missing mandatory fields like name or phone number):","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * 3a1. CCBot shows an error message indicating the validation failure and the correct format of the command.","lastModifiedDate":"2024-03-10"},{"lineNumber":338,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"ZHANGTIANYAO1"},"content":"*a. At any time, User chooses to cancel the addition.","lastModifiedDate":"2024-03-10"},{"lineNumber":341,"author":{"gitId":"ZHANGTIANYAO1"},"content":" *a1. CCBot requests to confirm cancellation","lastModifiedDate":"2024-03-10"},{"lineNumber":342,"author":{"gitId":"ZHANGTIANYAO1"},"content":" *a2. User confirms the cancellation","lastModifiedDate":"2024-03-10"},{"lineNumber":343,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case ends.","lastModifiedDate":"2024-03-10"},{"lineNumber":344,"author":{"gitId":"ZHANGTIANYAO1"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Use case: Add Salary Range to a Contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"ZHANGTIANYAO1"},"content":"1. The user decides to add a new contact with the salary or salary range info to their address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"ZHANGTIANYAO1"},"content":"2. User inputs the \u0027add\u0027 command with the salary detail in the correct format.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"ZHANGTIANYAO1"},"content":"3. System validates the salary format and range.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"ZHANGTIANYAO1"},"content":"4. System adds or updates the salary information for the contact and displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* 3a. If the salary detail is invalid:","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * 3a1. CCBot shows an error message indicating the validation failure and the correct format of the command.","lastModifiedDate":"2024-03-10"},{"lineNumber":361,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"ZHANGTIANYAO1"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Use case: Add the Company’s Name to a Contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"ZHANGTIANYAO1"},"content":"1. The user decides to add a new contact with the company’s name info to their address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"ZHANGTIANYAO1"},"content":"2. User inputs the \u0027add\u0027 command with the company’s name in the correct format.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"ZHANGTIANYAO1"},"content":"3. System validates the salary format and range.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"ZHANGTIANYAO1"},"content":"4. System adds or updates the company’s name information for the contact and displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* 3a. If the company’s name is bigger than 100 characters:","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * 3a1. CCBot shows an error message indicating the validation failure and the limit characters number.","lastModifiedDate":"2024-03-10"},{"lineNumber":381,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"ZHANGTIANYAO1"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Use case: Add Programming Language to a Contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"ZHANGTIANYAO1"},"content":"1. The user decides to add a new contact with the programming language info to their address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"ZHANGTIANYAO1"},"content":"2. User inputs the \u0027add\u0027 command with the programming language detail in the correct format.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"ZHANGTIANYAO1"},"content":"3. System validates the salary format and range.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"ZHANGTIANYAO1"},"content":"4. System adds or updates the programming language information for the contact and displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"ZHANGTIANYAO1"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* 3a. If the programming language detail is invalid:","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * 3a1. CCBot shows an error message indicating the validation failure and an error message about the format or character limit.","lastModifiedDate":"2024-03-10"},{"lineNumber":401,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"ZHANGTIANYAO1"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"ZHANGTIANYAO1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"ZHANGTIANYAO1"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"dabzpengu"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"dabzpengu"},"content":"4. User Interface should be intuitive enough for users to easily add interview dates and salaries.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"dabzpengu"},"content":"5. System should be able to cater to various date formats given by users.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"dabzpengu"},"content":"6. System should be able to handle a minimum of 100 contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":421,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ZHANGTIANYAO1":87,"Lalelulilulela":2,"dabzpengu":4,"-":381}},{"path":"docs/team/dexter.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Dexter-Wong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Dexter-Wong"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Dexter-Wong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Dexter-Wong"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Dexter-Wong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Dexter-Wong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Dexter-Wong"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Dexter-Wong"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Dexter-Wong"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Dexter-Wong"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Dexter-Wong"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Dexter-Wong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Dexter-Wong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Dexter-Wong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Dexter-Wong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Dexter-Wong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Dexter-Wong"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Dexter-Wong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Dexter-Wong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Dexter-Wong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Dexter-Wong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Dexter-Wong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Dexter-Wong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Dexter-Wong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Dexter-Wong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Dexter-Wong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Dexter-Wong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Dexter-Wong"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"Dexter-Wong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Dexter-Wong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Dexter-Wong":46}}] diff --git a/AY2324S2-CS2103T-T08-3_tp_master/commits.json b/AY2324S2-CS2103T-T08-3_tp_master/commits.json index c36742f6..b6014c4b 100644 --- a/AY2324S2-CS2103T-T08-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T08-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"ashleyy2444":[],"ZHANGTIANYAO1":[{"date":"2024-03-06","commitResults":[{"hash":"295120da196bbe5379d0c70f80fa8af3afd2c7cf","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"05151230009c43b638afe7b3182051dd8eb71ac4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"2cf4c130f72f3d590b00e232a497511502343e9c","isMergeCommit":false,"messageTitle":"Create zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":0}}},{"hash":"e900d5dbc2d861fe5271e34cae83b17f0b116485","isMergeCommit":true,"messageTitle":"Merge pull request #1 from ZHANGTIANYAO1/Update-AboutUS","messageBody":"Add personal picture","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"ef77bc29e4846d2a0a26c4eb7d28011dbb39fe06","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"069204c19d96ecb2f2ba7d3e3ea509ed18fb5009","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e7dda709ce0be666792eef5de28150c1cee4778b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b2fbf41718f013605088a15754c27b9582228ffd","isMergeCommit":false,"messageTitle":"Delete docs/team/zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":7}}},{"hash":"4706b8c32e71d8a70557e55aaadb495f45a86757","isMergeCommit":false,"messageTitle":"Delete docs/AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":59}}},{"hash":"1f384844312b659758d20d831deed4fce5b0fc93","isMergeCommit":false,"messageTitle":"Create AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":0}}},{"hash":"0e9e70842512853df00e55f50167748f715ca3f3","isMergeCommit":true,"messageTitle":"Merge pull request #4 from ZHANGTIANYAO1/Update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}},{"hash":"9a944b36aacfc19e2afc23831161532d78b5f836","isMergeCommit":true,"messageTitle":"Merge pull request #5 from dabzpengu/AboutUS","messageBody":"update issue #1","fileTypesAndContributionMap":{}},{"hash":"bc6528d57d550164316ed83df5ba608b44762b76","isMergeCommit":true,"messageTitle":"Merge pull request #6 from Lalelulilulela/branch-updateAboutUs","messageBody":"Update AboutUs.md and create yj.md","fileTypesAndContributionMap":{}},{"hash":"7d43e67f0da1eb15b2868cf9b11e7662db5c78fe","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Dexter-Wong/v1.1","messageBody":"Update the AboutUs.md file and include new images","fileTypesAndContributionMap":{}}]}],"Lalelulilulela":[{"date":"2024-03-07","commitResults":[{"hash":"99756d0e6caba81b51e4d3b22bf0e6d907f68b1f","isMergeCommit":false,"messageTitle":"Update AboutUs.md and create yj.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"8a39da76061a46a912f188c63684ee485c3052a4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"6e78db8b9046c709ff04b1a9caa2428480ffbd10","isMergeCommit":false,"messageTitle":"update target user profile in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"0eb8be4b097877bc356e8cc59eb71d6ccf53d0cc","isMergeCommit":false,"messageTitle":"Revert \"update target user profile in DeveloperGuide.md\"","messageBody":"This reverts commit 6e78db8b9046c709ff04b1a9caa2428480ffbd10.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":2}}},{"hash":"a1c368d6ee9a3a371e00adc96dcc650aa1cfd765","isMergeCommit":false,"messageTitle":"Update target user profile in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"dabzpengu":[{"date":"2024-03-07","commitResults":[{"hash":"3774ffd1bfdb594e3ecdfb78eac63ee708c53440","isMergeCommit":false,"messageTitle":"update issue #1","messageBody":"added role\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}}]},{"date":"2024-03-08","commitResults":[{"hash":"33c4523a74000f11f1e72630b5908de2caae1ed2","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Lalelulilulela/branch-DG-target-user-profile","messageBody":"Update Target User Profile in DG","fileTypesAndContributionMap":{}}]}],"Dexter-Wong":[{"date":"2024-03-07","commitResults":[{"hash":"d0f941156237f13bb99ba5e0577c2b34ae29d3a9","isMergeCommit":false,"messageTitle":"Update the AboutUs.md file and include new images","messageBody":"The AboutUs.md file allows users to find out more\nabout the developers.\n\nUpdating the AboutUs.md file allows us to delegate\ngroup work more efficiently.\n","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"ashleyy2444":{"docs":0,"functional-code":0,"test-code":0},"ZHANGTIANYAO1":{"docs":7,"functional-code":0,"test-code":0},"Lalelulilulela":{"docs":5,"functional-code":0,"test-code":0},"dabzpengu":{"docs":4,"functional-code":0,"test-code":0},"Dexter-Wong":{"docs":50,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ashleyy2444":0.0,"ZHANGTIANYAO1":1199.1735,"Lalelulilulela":22.462221,"dabzpengu":5.04,"Dexter-Wong":181.44},"authorDisplayNameMap":{"ashleyy2444":"CS2103T-T08-3 CHUA..HLEY","ZHANGTIANYAO1":"CS2103T-T08-3 ZHAN..NYAO","Lalelulilulela":"CS2103T-T08-3 TAN ..JING","dabzpengu":"CS2103T-T08-3 MUHA..AHIM","Dexter-Wong":"CS2103T-T08-3 DEXT.. YOU"}} +{"authorDailyContributionsMap":{"ashleyy2444":[],"ZHANGTIANYAO1":[{"date":"2024-03-06","commitResults":[{"hash":"295120da196bbe5379d0c70f80fa8af3afd2c7cf","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"05151230009c43b638afe7b3182051dd8eb71ac4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"2cf4c130f72f3d590b00e232a497511502343e9c","isMergeCommit":false,"messageTitle":"Create zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":0}}},{"hash":"e900d5dbc2d861fe5271e34cae83b17f0b116485","isMergeCommit":true,"messageTitle":"Merge pull request #1 from ZHANGTIANYAO1/Update-AboutUS","messageBody":"Add personal picture","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"ef77bc29e4846d2a0a26c4eb7d28011dbb39fe06","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"069204c19d96ecb2f2ba7d3e3ea509ed18fb5009","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e7dda709ce0be666792eef5de28150c1cee4778b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b2fbf41718f013605088a15754c27b9582228ffd","isMergeCommit":false,"messageTitle":"Delete docs/team/zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":7}}},{"hash":"4706b8c32e71d8a70557e55aaadb495f45a86757","isMergeCommit":false,"messageTitle":"Delete docs/AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":59}}},{"hash":"1f384844312b659758d20d831deed4fce5b0fc93","isMergeCommit":false,"messageTitle":"Create AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":0}}},{"hash":"0e9e70842512853df00e55f50167748f715ca3f3","isMergeCommit":true,"messageTitle":"Merge pull request #4 from ZHANGTIANYAO1/Update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}},{"hash":"9a944b36aacfc19e2afc23831161532d78b5f836","isMergeCommit":true,"messageTitle":"Merge pull request #5 from dabzpengu/AboutUS","messageBody":"update issue #1","fileTypesAndContributionMap":{}},{"hash":"bc6528d57d550164316ed83df5ba608b44762b76","isMergeCommit":true,"messageTitle":"Merge pull request #6 from Lalelulilulela/branch-updateAboutUs","messageBody":"Update AboutUs.md and create yj.md","fileTypesAndContributionMap":{}},{"hash":"7d43e67f0da1eb15b2868cf9b11e7662db5c78fe","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Dexter-Wong/v1.1","messageBody":"Update the AboutUs.md file and include new images","fileTypesAndContributionMap":{}},{"hash":"7817bcb9642d989a3b46bf7e96ccc82e14f4689d","isMergeCommit":false,"messageTitle":"Update the use case for add a person into addressbook","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":0}}},{"hash":"faa057a20840a86e0e9141025f94063601818bb8","isMergeCommit":false,"messageTitle":"Create the use case for Add the Company’s Name to a Contact Create the use case for Add Salary Range to a Contact","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":2}}},{"hash":"58955daaf26fa000af2a8df4ca2e7b174874a0e4","isMergeCommit":false,"messageTitle":"Create the use case for Add Programming Language to a Contact","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":1}}}]},{"date":"2024-03-10","commitResults":[{"hash":"fb5bce38392b6d333c3305e767c44985804e704b","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"473b99670577e7e540237ca480127fab4dbecc55","isMergeCommit":false,"messageTitle":"Apply suggestions from code review","messageBody":"Co-authored-by: dabzpengu \u003c97381253+dabzpengu@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"75b5f330e94c00ded11f7bb88c14f09e2fe4b556","isMergeCommit":false,"messageTitle":"Apply suggestions from code review","messageBody":"Co-authored-by: dabzpengu \u003c97381253+dabzpengu@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}},{"hash":"781d4713b76b195cd04f0d05d0ee130c4095d98d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"Lalelulilulela":[{"date":"2024-03-07","commitResults":[{"hash":"99756d0e6caba81b51e4d3b22bf0e6d907f68b1f","isMergeCommit":false,"messageTitle":"Update AboutUs.md and create yj.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"8a39da76061a46a912f188c63684ee485c3052a4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"6e78db8b9046c709ff04b1a9caa2428480ffbd10","isMergeCommit":false,"messageTitle":"update target user profile in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"0eb8be4b097877bc356e8cc59eb71d6ccf53d0cc","isMergeCommit":false,"messageTitle":"Revert \"update target user profile in DeveloperGuide.md\"","messageBody":"This reverts commit 6e78db8b9046c709ff04b1a9caa2428480ffbd10.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":2}}},{"hash":"a1c368d6ee9a3a371e00adc96dcc650aa1cfd765","isMergeCommit":false,"messageTitle":"Update target user profile in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"dabzpengu":[{"date":"2024-03-07","commitResults":[{"hash":"3774ffd1bfdb594e3ecdfb78eac63ee708c53440","isMergeCommit":false,"messageTitle":"update issue #1","messageBody":"added role\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"85ecbfc498a9c2ce4af2f477085cdc338639f9ca","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T08-3/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c2c6342da460afb2da8232e729a1f4df85b57a63","isMergeCommit":false,"messageTitle":"update issue #11","messageBody":"added NFRs for DG\nadded site-wide settings in yml file\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"33c4523a74000f11f1e72630b5908de2caae1ed2","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Lalelulilulela/branch-DG-target-user-profile","messageBody":"Update Target User Profile in DG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"ca1757306ba732af00cae58c48126c3117b93587","isMergeCommit":true,"messageTitle":"Merge pull request #15 from dabzpengu/DGUpdate-NFR","messageBody":"Dg update nfr","fileTypesAndContributionMap":{}},{"hash":"227d31d46c0afcfc63d06052e38e6f08b8ddc47c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-DG-Use-Cases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"043ed0eb1dd17ad894914e488e4b6416aec7f929","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ZHANGTIANYAO1/Update-DG-Use-Cases","messageBody":"Update DG use cases","fileTypesAndContributionMap":{}}]}],"Dexter-Wong":[{"date":"2024-03-07","commitResults":[{"hash":"d0f941156237f13bb99ba5e0577c2b34ae29d3a9","isMergeCommit":false,"messageTitle":"Update the AboutUs.md file and include new images","messageBody":"The AboutUs.md file allows users to find out more\nabout the developers.\n\nUpdating the AboutUs.md file allows us to delegate\ngroup work more efficiently.\n","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"ashleyy2444":{"docs":0,"functional-code":0,"test-code":0},"ZHANGTIANYAO1":{"docs":99,"functional-code":0,"test-code":0},"Lalelulilulela":{"docs":5,"functional-code":0,"test-code":0},"dabzpengu":{"docs":8,"functional-code":0,"test-code":0},"Dexter-Wong":{"docs":50,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ashleyy2444":0.0,"ZHANGTIANYAO1":2889.5571,"Lalelulilulela":19.98616,"dabzpengu":9.356402,"Dexter-Wong":161.43942},"authorDisplayNameMap":{"ashleyy2444":"CS2103T-T08-3 CHUA..HLEY","ZHANGTIANYAO1":"CS2103T-T08-3 ZHAN..NYAO","Lalelulilulela":"CS2103T-T08-3 TAN ..JING","dabzpengu":"CS2103T-T08-3 MUHA..AHIM","Dexter-Wong":"CS2103T-T08-3 DEXT.. YOU"}} diff --git a/AY2324S2-CS2103T-T11-1_tp_master/authorship.json b/AY2324S2-CS2103T-T11-1_tp_master/authorship.json index eb498c56..28960d3e 100644 --- a/AY2324S2-CS2103T-T11-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T11-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ReflectiveObsidian"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T11-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T11-1/tp/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp/graph/badge.svg?token\u003dadCrBd42f9)](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp)","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"**Journal for Enthusiasts in Noting Genealogical Associations**","lastModifiedDate":"2024-02-23"},{"lineNumber":6,"author":{"gitId":"ReflectiveObsidian"},"content":"### Introduction","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"JENGA helps Genealogists keep track of details of relatives, and easy storage and retrieval of the relationship between relatives. It does not cover discovery of new information, other than highlighting links/anomalies between existing information.","lastModifiedDate":"2024-02-23"},{"lineNumber":8,"author":{"gitId":"ReflectiveObsidian"},"content":"### Documentation","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"ReflectiveObsidian"},"content":"- [User Guide](https://github.com/AY2324S2-CS2103T-T11-1/tp/blob/master/docs/UserGuide.md)","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"ReflectiveObsidian"},"content":"- [Developer Guide](https://github.com/AY2324S2-CS2103T-T11-1/tp/blob/master/docs/DeveloperGuide.md)","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ReflectiveObsidian"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ReflectiveObsidian"},"content":"**Acknowledgements**","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ReflectiveObsidian"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ReflectiveObsidian"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"ReflectiveObsidian":13,"Bandov":2,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"DingBao-sys"},"content":"\u003ch1 align\u003dcenter\u003e\u003ci\u003eABOUT US\u003c/i\u003e\u003c/h1\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"DingBao-sys"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"DingBao-sys"},"content":"\u003cp align\u003d\"center\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore] (http://www.comp.nus.edu.sg). ","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"DingBao-sys"},"content":"You can reach us at the email \u003ccode\u003eseer[at]comp.nus.edu.sg\u003c/code\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"DingBao-sys"},"content":"\u003c/p\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"DingBao-sys"},"content":"\u003ch2 align\u003dcenter\u003e\u003ci\u003eProject team\u003c/I\u003e\u003c/h2\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"DingBao-sys"},"content":"| Name | Role | Responsibility |","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"DingBao-sys"},"content":"|:-----------------------------------------------------------------------------------------------------------------------------------------------:|:---------:|:----------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ReflectiveObsidian"},"content":"| \u003ch2\u003eREFLECTIVE OBSIDIAN\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/reflectiveobsidian.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/ReflectiveObsidian)] | Developer | \u003cul\u003e\u003cli\u003eData\u003c/li\u003e\u003cli\u003eLogic\u003c/li\u003e |","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eBandov\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/bandov.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/Bandov)] | Developer | \u003cul\u003e\u003cli\u003eUI\u003c/li\u003e\u003cli\u003eModel\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eTsenrae\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/tsenrae.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/Tsenrae)] | Developer | \u003cul\u003e\u003cli\u003eData\u003c/li\u003e\u003cli\u003eStorage\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eDingBao-sys\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/dingbao-sys.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/DingBao-sys)] | Developer | \u003cul\u003e\u003cli\u003eUI\u003c/li\u003e\u003cli\u003eModel\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eEmberlynn-Loo\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/emberlynn-loo.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/Emberlynn-Loo)] | Developer | \u003cul\u003e\u003cli\u003eData\u003c/li\u003e\u003cli\u003eModel\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"DingBao-sys":12,"ReflectiveObsidian":1,"-":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"Bandov"},"content":"* Has many family members to keep track off","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"Bandov"},"content":"* Wants to keep various information about these different family members","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"Bandov"},"content":"* Wants to visualize connections between family members","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"Bandov"},"content":"* Often only has provisional or partial information about their family members","lastModifiedDate":"2024-02-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"Bandov"},"content":"**Value proposition**: JENGA puts connections between people at the forefront.","lastModifiedDate":"2024-02-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"Bandov"},"content":"|----------|--------| ----------------------------- | ---------------------------------------------------------------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Create a new person with a Unique User ID | Ensure every person in my address book is distinct |","lastModifiedDate":"2024-02-29"},{"lineNumber":280,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Add custom attributes to each person |Store personal information relevant to each individual |","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Establish and record relationships between people | Visualize connections between people |","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Find the relationship path between people | Understand how everyone is connected |","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"Bandov"},"content":"| `* *` | user | Have clear success or failure messages after actions | Ensure that the intended action has taken place |","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"Bandov"},"content":"| `* *` | user | Sort and search a person by their attributes | Find specific individuals more easily |","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Have my data automatically saved once i exit the app and loaded once i start the app | Seamless experience across different sessions |","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Add a new person**","lastModifiedDate":"2024-03-03"},{"lineNumber":294,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":295,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":296,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":297,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to add a new person to JENGA.","lastModifiedDate":"2024-03-03"},{"lineNumber":298,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for details of new person.","lastModifiedDate":"2024-03-03"},{"lineNumber":299,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters the necessary information.","lastModifiedDate":"2024-03-03"},{"lineNumber":300,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA adds person with the provided details.","lastModifiedDate":"2024-03-03"},{"lineNumber":301,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays new person added and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":302,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":303,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":304,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":305,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":306,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":307,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. User enters incomplete or invalid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":308,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":309,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":310,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":311,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":312,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":313,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":314,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":315,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":316,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":322,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA displays a list of persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":323,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User selects a specific person in the list to delete by providing the person’s UUID.","lastModifiedDate":"2024-03-03"},{"lineNumber":324,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes the person.","lastModifiedDate":"2024-03-03"},{"lineNumber":325,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"Emberlynn-Loo"},"content":" * 2a1. JENGA informs the user the list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":334,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":335,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":336,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":337,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":338,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":339,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":340,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":341,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Add an attribute to a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":344,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":345,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":346,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":347,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to add an attribute to a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":348,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user to enter the person’s UUID and attribute details.","lastModifiedDate":"2024-03-03"},{"lineNumber":349,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters UUID and attribute information.","lastModifiedDate":"2024-03-03"},{"lineNumber":350,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA adds attribute details to specific person’s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":351,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays attribute in person’s profile and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":352,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":353,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":354,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":355,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Edit to add an attribute to a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":385,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to edit to add an attribute to a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":386,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user to enter the person’s UUID and attribute details to add.","lastModifiedDate":"2024-03-03"},{"lineNumber":387,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters UUID and attribute information.","lastModifiedDate":"2024-03-03"},{"lineNumber":388,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA adds attribute details to specific person’s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":389,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays attribute in person’s profile and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":390,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":391,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":392,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":393,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":394,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":395,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":396,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":397,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":399,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":401,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":403,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":404,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":405,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":406,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":407,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":408,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":409,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":410,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":411,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":412,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":413,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":414,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":415,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":416,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":417,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":418,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":419,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Edit to delete an attribute to a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":420,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":421,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":422,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":423,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to edit to delete an attribute to a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":424,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user to enter the person’s UUID and attribute to delete.","lastModifiedDate":"2024-03-03"},{"lineNumber":425,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters UUID and attribute information.","lastModifiedDate":"2024-03-03"},{"lineNumber":426,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes attribute in specific person’s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":427,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":428,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":429,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":430,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":431,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":432,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":433,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":434,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":435,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":436,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":437,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":438,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":439,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":440,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":441,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":442,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":443,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":444,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":445,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":446,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":447,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":448,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":449,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":450,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":451,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":452,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":453,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":454,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":455,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":456,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":457,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Delete a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":458,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":459,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":460,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":461,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to delete a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":462,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for details of person.","lastModifiedDate":"2024-03-03"},{"lineNumber":463,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters person’s UUID.","lastModifiedDate":"2024-03-03"},{"lineNumber":464,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes person.","lastModifiedDate":"2024-03-03"},{"lineNumber":465,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":466,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":467,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":468,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":469,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":470,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":471,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":472,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":473,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":474,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":475,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":476,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":477,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":478,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":479,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":480,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":481,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Find persons by attribute**","lastModifiedDate":"2024-03-03"},{"lineNumber":482,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":483,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":484,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":485,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to find persons by attribute.","lastModifiedDate":"2024-03-03"},{"lineNumber":486,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for attribute and attribute value(s).","lastModifiedDate":"2024-03-03"},{"lineNumber":487,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters attribute name and attribute value(s).","lastModifiedDate":"2024-03-03"},{"lineNumber":488,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA displays list of persons with each of the specified attributes.","lastModifiedDate":"2024-03-03"},{"lineNumber":489,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":490,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":491,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":492,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":493,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":494,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":495,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":496,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":497,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":498,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":499,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":500,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":501,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":502,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":503,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":504,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":505,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":506,"author":{"gitId":"Emberlynn-Loo"},"content":"* 4a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":507,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":508,"author":{"gitId":"Emberlynn-Loo"},"content":" * 4a1. JENGA informs the user the list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":509,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":510,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":511,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":512,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Find persons by relationship to User**","lastModifiedDate":"2024-03-03"},{"lineNumber":513,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":514,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":515,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":516,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to find persons by relationship.","lastModifiedDate":"2024-03-03"},{"lineNumber":517,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for relationship to User.","lastModifiedDate":"2024-03-03"},{"lineNumber":518,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":519,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA displays list of persons with specified relationship to User.","lastModifiedDate":"2024-03-03"},{"lineNumber":520,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":521,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":522,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":523,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":524,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":525,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":526,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":527,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":528,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":529,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":530,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":531,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":532,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":533,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":534,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":535,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":536,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":537,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Add a relationship between two persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":538,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":539,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":540,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":541,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to add a relationship between two persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":542,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for UUIDs of both persons and relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":543,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters both persons UUID and relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":544,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA creates a relationship with the provided details.","lastModifiedDate":"2024-03-03"},{"lineNumber":545,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays new relationship added under both persons’ profiles and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":546,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":547,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":548,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":549,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":550,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":551,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship type is invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":552,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":553,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":554,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":555,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":556,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":557,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":558,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":559,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":560,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":561,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":562,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":563,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUIDs are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":564,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":565,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":566,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":567,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":568,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":569,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":570,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":571,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":572,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":573,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":574,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":575,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Edit a relationship between two persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":576,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":577,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":578,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":579,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to edit a specific relationship between two persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":580,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for UUIDs of both persons and previous and new relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":581,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters both persons UUID and previous and new relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":582,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA edits the specified relationship with the provided details.","lastModifiedDate":"2024-03-03"},{"lineNumber":583,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays edited relationship under both persons’ profiles and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":584,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":585,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":586,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":587,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":588,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":589,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship types are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":590,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":591,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":592,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":593,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":594,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":595,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":596,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":597,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":598,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":599,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":600,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":601,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUIDs are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":602,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":603,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":604,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":605,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":606,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":607,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":608,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":609,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":610,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":611,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Delete a relationship between two persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":614,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":615,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":616,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":617,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to delete a specific relationship between two persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":618,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for UUIDs of both persons and relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":619,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters both persons UUID and specified relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":620,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes specified relationship.","lastModifiedDate":"2024-03-03"},{"lineNumber":621,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":622,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":623,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":624,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":625,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":626,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":627,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship type is invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":628,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":629,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":630,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":631,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":632,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":633,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":634,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":635,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":636,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":637,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":638,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":639,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUIDs are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":640,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":641,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":642,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":643,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":644,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":645,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":646,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":647,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":648,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":649,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":650,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":651,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Exit JENGA**","lastModifiedDate":"2024-03-03"},{"lineNumber":652,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":653,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":654,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":655,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to exit JENGA.","lastModifiedDate":"2024-03-03"},{"lineNumber":656,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA displays goodbye message.","lastModifiedDate":"2024-03-03"},{"lineNumber":657,"author":{"gitId":"Emberlynn-Loo"},"content":"3. JENGA saves current data.","lastModifiedDate":"2024-03-03"},{"lineNumber":658,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA closes the application window.","lastModifiedDate":"2024-03-03"},{"lineNumber":659,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":660,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":661,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":662,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":663,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":664,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":665,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":666,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":667,"author":{"gitId":"Tsenrae"},"content":"2. Should be able to hold up to 1000 persons and relationships without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":668,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":669,"author":{"gitId":"Tsenrae"},"content":"4. User actions should prompt responses within 5 seconds, maintaining acceptable performance standards.","lastModifiedDate":"2024-03-03"},{"lineNumber":670,"author":{"gitId":"Tsenrae"},"content":"5. The user interface must be intuitive for users of varying technical proficiency levels, enhancing usability.","lastModifiedDate":"2024-03-03"},{"lineNumber":671,"author":{"gitId":"Tsenrae"},"content":"6. The codebase should be well-documented and maintainable to facilitate future updates and enhancements.","lastModifiedDate":"2024-03-03"},{"lineNumber":672,"author":{"gitId":"Tsenrae"},"content":"7. Comprehensive documentation should be provided for developers, administrators, and end-users, supporting ease of use.","lastModifiedDate":"2024-03-03"},{"lineNumber":673,"author":{"gitId":"Tsenrae"},"content":"8. The system should be able to handle data corruption or loss gracefully, minimizing the impact on users.","lastModifiedDate":"2024-03-03"},{"lineNumber":674,"author":{"gitId":"Tsenrae"},"content":"9. The system architecture should support future extensions or customizations, allowing for easy addition of new features.","lastModifiedDate":"2024-03-03"},{"lineNumber":675,"author":{"gitId":"Tsenrae"},"content":"10. Interoperability with other systems should be supported through standard protocols and formats, promoting seamless integration.","lastModifiedDate":"2024-03-03"},{"lineNumber":676,"author":{"gitId":"Tsenrae"},"content":"11. The system should be designed with testability in mind, allowing for comprehensive testing of all components, features, and scenarios.","lastModifiedDate":"2024-03-03"},{"lineNumber":677,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":678,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":679,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":680,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":681,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":682,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":683,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":684,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":685,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":686,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":687,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":688,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":689,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":690,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":691,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":692,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":693,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":694,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":695,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":696,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":697,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":698,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":699,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":700,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":701,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":702,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":703,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":704,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":705,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":706,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":707,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":708,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":709,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":710,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":711,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":712,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":713,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":714,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":715,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":716,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":717,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":718,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":719,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":720,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":721,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":722,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":723,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":724,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":725,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":726,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":727,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":728,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":729,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":730,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":731,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":732,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":733,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":734,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Bandov":13,"-":362,"Emberlynn-Loo":350,"Tsenrae":9}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"ReflectiveObsidian"},"content":" content: \"JENGA\";","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"ReflectiveObsidian":1,"-":294}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"ReflectiveObsidian"},"content":"title: JENGA (Journal for Enthusiasts in Noting Genealogical Associations)","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"ReflectiveObsidian"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T11-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T11-1/tp/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp/graph/badge.svg?token\u003dadCrBd42f9)](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp)","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"ReflectiveObsidian"},"content":"**JENGA helps Genealogists keep track of details of relatives**, ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ReflectiveObsidian"},"content":"and easy storage and retrieval of the relationship between relatives. ","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ReflectiveObsidian"},"content":"It does not cover discovery of new information, ","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ReflectiveObsidian"},"content":"other than highlighting links/anomalies between existing information.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ReflectiveObsidian"},"content":"While it has a GUI, ","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ReflectiveObsidian"},"content":"most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"ReflectiveObsidian"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ReflectiveObsidian":10,"-":14}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ReflectiveObsidian"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T11-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T11-1/tp/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp/graph/badge.svg?token\u003dadCrBd42f9)](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp)","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"**Journal for Enthusiasts in Noting Genealogical Associations**","lastModifiedDate":"2024-02-23"},{"lineNumber":6,"author":{"gitId":"ReflectiveObsidian"},"content":"### Introduction","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"JENGA helps Genealogists keep track of details of relatives, and easy storage and retrieval of the relationship between relatives. It does not cover discovery of new information, other than highlighting links/anomalies between existing information.","lastModifiedDate":"2024-02-23"},{"lineNumber":8,"author":{"gitId":"ReflectiveObsidian"},"content":"### Documentation","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"ReflectiveObsidian"},"content":"- [User Guide](https://github.com/AY2324S2-CS2103T-T11-1/tp/blob/master/docs/UserGuide.md)","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"ReflectiveObsidian"},"content":"- [Developer Guide](https://github.com/AY2324S2-CS2103T-T11-1/tp/blob/master/docs/DeveloperGuide.md)","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ReflectiveObsidian"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ReflectiveObsidian"},"content":"**Acknowledgements**","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ReflectiveObsidian"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ReflectiveObsidian"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"ReflectiveObsidian":13,"Bandov":2,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"DingBao-sys"},"content":"\u003ch1 align\u003dcenter\u003e\u003ci\u003eABOUT US\u003c/i\u003e\u003c/h1\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"DingBao-sys"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"DingBao-sys"},"content":"\u003cp align\u003d\"center\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore] (http://www.comp.nus.edu.sg). ","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"DingBao-sys"},"content":"You can reach us at the email \u003ccode\u003eseer[at]comp.nus.edu.sg\u003c/code\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"DingBao-sys"},"content":"\u003c/p\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"DingBao-sys"},"content":"\u003ch2 align\u003dcenter\u003e\u003ci\u003eProject team\u003c/I\u003e\u003c/h2\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"DingBao-sys"},"content":"| Name | Role | Responsibility |","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"DingBao-sys"},"content":"|:-----------------------------------------------------------------------------------------------------------------------------------------------:|:---------:|:----------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ReflectiveObsidian"},"content":"| \u003ch2\u003eREFLECTIVE OBSIDIAN\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/reflectiveobsidian.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/ReflectiveObsidian)] | Developer | \u003cul\u003e\u003cli\u003eData\u003c/li\u003e\u003cli\u003eLogic\u003c/li\u003e |","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eBandov\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/bandov.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/Bandov)] | Developer | \u003cul\u003e\u003cli\u003eUI\u003c/li\u003e\u003cli\u003eModel\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eTsenrae\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/tsenrae.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/Tsenrae)] | Developer | \u003cul\u003e\u003cli\u003eData\u003c/li\u003e\u003cli\u003eStorage\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eDingBao-sys\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/dingbao-sys.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/DingBao-sys)] | Developer | \u003cul\u003e\u003cli\u003eUI\u003c/li\u003e\u003cli\u003eModel\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"DingBao-sys"},"content":"| \u003ch2\u003eEmberlynn-Loo\u003c/h2\u003e\u003c/br\u003e\u003cimg src\u003d\"images/emberlynn-loo.png\" width\u003d\"200px\"\u003e\u003c/br\u003e[[github](https://github.com/Emberlynn-Loo)] | Developer | \u003cul\u003e\u003cli\u003eData\u003c/li\u003e\u003cli\u003eModel\u003c/li\u003e |","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"DingBao-sys":12,"ReflectiveObsidian":1,"-":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"Bandov"},"content":"* Has many family members to keep track off","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"Bandov"},"content":"* Wants to keep various information about these different family members","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"Bandov"},"content":"* Wants to visualize connections between family members","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"Bandov"},"content":"* Often only has provisional or partial information about their family members","lastModifiedDate":"2024-02-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"Bandov"},"content":"**Value proposition**: JENGA puts connections between people at the forefront.","lastModifiedDate":"2024-02-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"Bandov"},"content":"|----------|--------| ----------------------------- | ---------------------------------------------------------------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Create a new person with a Unique User ID | Ensure every person in my address book is distinct |","lastModifiedDate":"2024-02-29"},{"lineNumber":280,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Add custom attributes to each person |Store personal information relevant to each individual |","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Establish and record relationships between people | Visualize connections between people |","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Find the relationship path between people | Understand how everyone is connected |","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"Bandov"},"content":"| `* *` | user | Have clear success or failure messages after actions | Ensure that the intended action has taken place |","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"Bandov"},"content":"| `* *` | user | Sort and search a person by their attributes | Find specific individuals more easily |","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"Bandov"},"content":"| `* * *` | user | Have my data automatically saved once i exit the app and loaded once i start the app | Seamless experience across different sessions |","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Add a new person**","lastModifiedDate":"2024-03-03"},{"lineNumber":294,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":295,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":296,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":297,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to add a new person to JENGA.","lastModifiedDate":"2024-03-03"},{"lineNumber":298,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for details of new person.","lastModifiedDate":"2024-03-03"},{"lineNumber":299,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters the necessary information.","lastModifiedDate":"2024-03-03"},{"lineNumber":300,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA adds person with the provided details.","lastModifiedDate":"2024-03-03"},{"lineNumber":301,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays new person added and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":302,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":303,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":304,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":305,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":306,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":307,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. User enters incomplete or invalid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":308,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":309,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":310,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":311,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":312,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":313,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":314,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":315,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":316,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":322,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA displays a list of persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":323,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User selects a specific person in the list to delete by providing the person’s UUID.","lastModifiedDate":"2024-03-03"},{"lineNumber":324,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes the person.","lastModifiedDate":"2024-03-03"},{"lineNumber":325,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"Emberlynn-Loo"},"content":" * 2a1. JENGA informs the user the list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":334,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":335,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":336,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":337,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":338,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":339,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":340,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":341,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Add an attribute to a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":344,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":345,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":346,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":347,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to add an attribute to a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":348,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user to enter the person’s UUID and attribute details.","lastModifiedDate":"2024-03-03"},{"lineNumber":349,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters UUID and attribute information.","lastModifiedDate":"2024-03-03"},{"lineNumber":350,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA adds attribute details to specific person’s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":351,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays attribute in person’s profile and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":352,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":353,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":354,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":355,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Edit to add an attribute to a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":385,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to edit to add an attribute to a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":386,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user to enter the person’s UUID and attribute details to add.","lastModifiedDate":"2024-03-03"},{"lineNumber":387,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters UUID and attribute information.","lastModifiedDate":"2024-03-03"},{"lineNumber":388,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA adds attribute details to specific person’s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":389,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays attribute in person’s profile and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":390,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":391,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":392,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":393,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":394,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":395,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":396,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":397,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":399,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":401,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":403,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":404,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":405,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":406,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":407,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":408,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":409,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":410,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":411,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":412,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":413,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":414,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":415,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":416,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":417,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":418,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":419,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Edit to delete an attribute to a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":420,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":421,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":422,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":423,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to edit to delete an attribute to a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":424,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user to enter the person’s UUID and attribute to delete.","lastModifiedDate":"2024-03-03"},{"lineNumber":425,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters UUID and attribute information.","lastModifiedDate":"2024-03-03"},{"lineNumber":426,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes attribute in specific person’s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":427,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":428,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":429,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":430,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":431,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":432,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":433,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":434,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":435,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":436,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":437,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":438,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":439,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":440,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":441,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":442,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":443,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":444,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":445,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":446,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":447,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":448,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":449,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":450,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":451,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":452,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":453,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":454,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":455,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":456,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":457,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Delete a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":458,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":459,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":460,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":461,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to delete a person.","lastModifiedDate":"2024-03-03"},{"lineNumber":462,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for details of person.","lastModifiedDate":"2024-03-03"},{"lineNumber":463,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters person’s UUID.","lastModifiedDate":"2024-03-03"},{"lineNumber":464,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes person.","lastModifiedDate":"2024-03-03"},{"lineNumber":465,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":466,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":467,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":468,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":469,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":470,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":471,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Given UUID is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":472,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":473,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":474,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":475,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":476,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":477,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":478,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":479,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":480,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":481,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Find persons by attribute**","lastModifiedDate":"2024-03-03"},{"lineNumber":482,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":483,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":484,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":485,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to find persons by attribute.","lastModifiedDate":"2024-03-03"},{"lineNumber":486,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for attribute and attribute value(s).","lastModifiedDate":"2024-03-03"},{"lineNumber":487,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters attribute name and attribute value(s).","lastModifiedDate":"2024-03-03"},{"lineNumber":488,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA displays list of persons with each of the specified attributes.","lastModifiedDate":"2024-03-03"},{"lineNumber":489,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":490,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":491,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":492,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":493,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":494,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Attribute details are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":495,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":496,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":497,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":498,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":499,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":500,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":501,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":502,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":503,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":504,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":505,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":506,"author":{"gitId":"Emberlynn-Loo"},"content":"* 4a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":507,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":508,"author":{"gitId":"Emberlynn-Loo"},"content":" * 4a1. JENGA informs the user the list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":509,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":510,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":511,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":512,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Find persons by relationship to User**","lastModifiedDate":"2024-03-03"},{"lineNumber":513,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":514,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":515,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":516,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to find persons by relationship.","lastModifiedDate":"2024-03-03"},{"lineNumber":517,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for relationship to User.","lastModifiedDate":"2024-03-03"},{"lineNumber":518,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":519,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA displays list of persons with specified relationship to User.","lastModifiedDate":"2024-03-03"},{"lineNumber":520,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":521,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":522,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":523,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":524,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":525,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship is invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":526,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":527,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":528,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":529,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":530,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":531,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":532,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":533,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":534,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":535,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":536,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":537,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Add a relationship between two persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":538,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":539,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":540,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":541,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to add a relationship between two persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":542,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for UUIDs of both persons and relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":543,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters both persons UUID and relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":544,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA creates a relationship with the provided details.","lastModifiedDate":"2024-03-03"},{"lineNumber":545,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays new relationship added under both persons’ profiles and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":546,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":547,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":548,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":549,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":550,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":551,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship type is invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":552,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":553,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":554,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":555,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":556,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":557,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":558,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":559,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":560,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":561,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":562,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":563,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUIDs are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":564,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":565,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":566,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":567,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":568,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":569,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":570,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":571,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":572,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":573,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":574,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":575,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Edit a relationship between two persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":576,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":577,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":578,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":579,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to edit a specific relationship between two persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":580,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for UUIDs of both persons and previous and new relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":581,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters both persons UUID and previous and new relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":582,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA edits the specified relationship with the provided details.","lastModifiedDate":"2024-03-03"},{"lineNumber":583,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays edited relationship under both persons’ profiles and confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":584,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":585,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":586,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":587,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":588,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":589,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship types are invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":590,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":591,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":592,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":593,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":594,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":595,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":596,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":597,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":598,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":599,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":600,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":601,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUIDs are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":602,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":603,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":604,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":605,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":606,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":607,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":608,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":609,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":610,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":611,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Delete a relationship between two persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":614,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":615,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":616,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":617,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to delete a specific relationship between two persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":618,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA prompts user for UUIDs of both persons and relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":619,"author":{"gitId":"Emberlynn-Loo"},"content":"3. User enters both persons UUID and specified relationship type.","lastModifiedDate":"2024-03-03"},{"lineNumber":620,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA deletes specified relationship.","lastModifiedDate":"2024-03-03"},{"lineNumber":621,"author":{"gitId":"Emberlynn-Loo"},"content":"5. JENGA displays confirmation message.","lastModifiedDate":"2024-03-03"},{"lineNumber":622,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":623,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":624,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":625,"author":{"gitId":"Emberlynn-Loo"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":626,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":627,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3a. Relationship type is invalid.","lastModifiedDate":"2024-03-03"},{"lineNumber":628,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":629,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":630,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":631,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":632,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":633,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":634,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":635,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":636,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":637,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":638,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":639,"author":{"gitId":"Emberlynn-Loo"},"content":"* 3b. Given UUIDs are invalid or does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":640,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":641,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a1. JENGA shows an error message.","lastModifiedDate":"2024-03-03"},{"lineNumber":642,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":643,"author":{"gitId":"Emberlynn-Loo"},"content":" * 3a2. JENGA prompts User to enter the correct and complete information.","lastModifiedDate":"2024-03-03"},{"lineNumber":644,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":645,"author":{"gitId":"Emberlynn-Loo"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-03"},{"lineNumber":646,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":647,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-03"},{"lineNumber":648,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":649,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":650,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":651,"author":{"gitId":"Emberlynn-Loo"},"content":"**Use case: Exit JENGA**","lastModifiedDate":"2024-03-03"},{"lineNumber":652,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":653,"author":{"gitId":"Emberlynn-Loo"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":654,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":655,"author":{"gitId":"Emberlynn-Loo"},"content":"1. User requests to exit JENGA.","lastModifiedDate":"2024-03-03"},{"lineNumber":656,"author":{"gitId":"Emberlynn-Loo"},"content":"2. JENGA displays goodbye message.","lastModifiedDate":"2024-03-03"},{"lineNumber":657,"author":{"gitId":"Emberlynn-Loo"},"content":"3. JENGA saves current data.","lastModifiedDate":"2024-03-03"},{"lineNumber":658,"author":{"gitId":"Emberlynn-Loo"},"content":"4. JENGA closes the application window.","lastModifiedDate":"2024-03-03"},{"lineNumber":659,"author":{"gitId":"Emberlynn-Loo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":660,"author":{"gitId":"Emberlynn-Loo"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":661,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":662,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":663,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":664,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":665,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":666,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":667,"author":{"gitId":"Tsenrae"},"content":"2. Should be able to hold up to 1000 persons and relationships without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":668,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":669,"author":{"gitId":"Tsenrae"},"content":"4. User actions should prompt responses within 5 seconds, maintaining acceptable performance standards.","lastModifiedDate":"2024-03-03"},{"lineNumber":670,"author":{"gitId":"Tsenrae"},"content":"5. The user interface must be intuitive for users of varying technical proficiency levels, enhancing usability.","lastModifiedDate":"2024-03-03"},{"lineNumber":671,"author":{"gitId":"Tsenrae"},"content":"6. The codebase should be well-documented and maintainable to facilitate future updates and enhancements.","lastModifiedDate":"2024-03-03"},{"lineNumber":672,"author":{"gitId":"Tsenrae"},"content":"7. Comprehensive documentation should be provided for developers, administrators, and end-users, supporting ease of use.","lastModifiedDate":"2024-03-03"},{"lineNumber":673,"author":{"gitId":"Tsenrae"},"content":"8. The system should be able to handle data corruption or loss gracefully, minimizing the impact on users.","lastModifiedDate":"2024-03-03"},{"lineNumber":674,"author":{"gitId":"Tsenrae"},"content":"9. The system architecture should support future extensions or customizations, allowing for easy addition of new features.","lastModifiedDate":"2024-03-03"},{"lineNumber":675,"author":{"gitId":"Tsenrae"},"content":"10. Interoperability with other systems should be supported through standard protocols and formats, promoting seamless integration.","lastModifiedDate":"2024-03-03"},{"lineNumber":676,"author":{"gitId":"Tsenrae"},"content":"11. The system should be designed with testability in mind, allowing for comprehensive testing of all components, features, and scenarios.","lastModifiedDate":"2024-03-03"},{"lineNumber":677,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":678,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":679,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":680,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":681,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":682,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":683,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":684,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":685,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":686,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":687,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":688,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":689,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":690,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":691,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":692,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":693,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":694,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":695,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":696,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":697,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":698,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":699,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":700,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":701,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":702,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":703,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":704,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":705,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":706,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":707,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":708,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":709,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":710,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":711,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":712,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":713,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":714,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":715,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":716,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":717,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":718,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":719,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":720,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":721,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":722,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":723,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":724,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":725,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":726,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":727,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":728,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":729,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":730,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":731,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":732,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":733,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":734,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Bandov":13,"-":362,"Emberlynn-Loo":350,"Tsenrae":9}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"ReflectiveObsidian"},"content":" content: \"JENGA\";","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"ReflectiveObsidian":1,"-":294}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"ReflectiveObsidian"},"content":"title: JENGA (Journal for Enthusiasts in Noting Genealogical Associations)","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"ReflectiveObsidian"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T11-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T11-1/tp/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp/graph/badge.svg?token\u003dadCrBd42f9)](https://codecov.io/gh/AY2324S2-CS2103T-T11-1/tp)","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"ReflectiveObsidian"},"content":"**JENGA helps Genealogists keep track of details of relatives**, ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ReflectiveObsidian"},"content":"and easy storage and retrieval of the relationship between relatives. ","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ReflectiveObsidian"},"content":"It does not cover discovery of new information, ","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ReflectiveObsidian"},"content":"other than highlighting links/anomalies between existing information.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ReflectiveObsidian"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ReflectiveObsidian"},"content":"While it has a GUI, ","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ReflectiveObsidian"},"content":"most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"ReflectiveObsidian"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ReflectiveObsidian":10,"-":14}},{"path":"src/main/java/seedu/address/model/person/Attribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"abstract class Attribute {","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":" protected String name;","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":" public Attribute(String name) {","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":" this.name \u003d name;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" public abstract String getValueAsString();","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" public String getName() {","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" return name;","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"Bandov":15}},{"path":"src/main/java/seedu/address/model/person/BirthdayAttribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import java.time.LocalDate;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"class BirthdayAttribute extends DateAttribute {","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":" public BirthdayAttribute(String name, LocalDate date) {","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":" super(name, date);","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":" // Validate that the provided date is before today","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" if (!date.isBefore(LocalDate.now())) {","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" throw new IllegalArgumentException(\"Birthday must be before today.\");","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":13}},{"path":"src/main/java/seedu/address/model/person/DateAttribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import java.time.LocalDate;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"class DateAttribute extends Attribute {","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":" private LocalDate value;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":" public DateAttribute(String name, LocalDate value) {","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" super(name);","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" this.value \u003d value;","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" public LocalDate getValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" return value;","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" public String getValueAsString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" return value.toString();","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" // Function for searching records by a specific date","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" public boolean isOnDate(LocalDate date) {","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" return value.isEqual(date);","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":26}},{"path":"src/main/java/seedu/address/model/person/IntegerAttribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"/**","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":" * Integer attribute with integer value","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"public class IntegerAttribute extends Attribute {","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":" private int value;","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" /**","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" * Constructor for IntegerAttribute","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" * @param name name of the attribute","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" * @param value value of the attribute","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" public IntegerAttribute(String name, int value) {","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" super(name);","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" this.value \u003d value;","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" public int getValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" return value;","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" public String getValueAsString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":" return Integer.toString(value);","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":" // Function for sorting by integer value","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"Bandov"},"content":" public int compare(IntegerAttribute other) {","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"Bandov"},"content":" return Integer.compare(value, other.value);","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":32}},{"path":"src/main/java/seedu/address/model/person/NameAttribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"/**","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":" * Name attribute with string value","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"public class NameAttribute extends StringAttribute {","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":" public NameAttribute(String name, String value) {","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":" super(name, value);","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":10}},{"path":"src/main/java/seedu/address/model/person/PhoneNumberAttribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"/**","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":" * Phone number attribute with integer value","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"public class PhoneNumberAttribute extends IntegerAttribute {","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":" public PhoneNumberAttribute(String name, int value) {","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":" super(name, value);","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":12}},{"path":"src/main/java/seedu/address/model/person/SexAttribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"// Gender attribute with enum","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"class SexAttribute extends Attribute {","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":" private Gender gender;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":" public enum Gender {","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":" MALE, FEMALE","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" public SexAttribute(String name, Gender gender) {","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" super(name);","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" this.gender \u003d gender;","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" public String getValueAsString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" return gender.toString();","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" public Gender getGender() {","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" return gender;","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":" public void setGender(Gender gender) {","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" this.gender \u003d gender;","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":28}},{"path":"src/main/java/seedu/address/model/person/StringAttribute.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"class StringAttribute extends Attribute {","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":" private String value;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":" public StringAttribute(String name, String value) {","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":" super(name);","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":" this.value \u003d value;","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" public String getValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" return value;","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" public String getValueAsString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" return value;","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" // Function for partial string matching","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" public boolean matches(String searchString) {","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" return value.contains(searchString);","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":24}},{"path":"src/test/java/seedu/address/model/person/AttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"public class AttributeTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" private static class ConcreteAttribute extends Attribute {","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" private String value;","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" public ConcreteAttribute(String name, String value) {","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" super(name);","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" this.value \u003d value;","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" public String getValueAsString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" return value;","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" private ConcreteAttribute attribute;","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" @BeforeEach","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":" public void setUp() {","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":" attribute \u003d new ConcreteAttribute(\"TestName\", \"TestValue\");","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"Bandov"},"content":" public void getName_returnsCorrectName() {","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestName\", attribute.getName(), \"The name should match the one set in constructor.\");","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"Bandov"},"content":" public void getValueAsString_returnsCorrectValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestValue\", attribute.getValueAsString(), \"The value should match the one set in constructor.\");","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":40}},{"path":"src/test/java/seedu/address/model/person/BirthdayAttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertThrows;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"import java.time.LocalDate;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":"public class BirthdayAttributeTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" public void testValidBirthdayBeforeToday() {","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" // Assuming today is not the test execution day, adjust the date accordingly","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" LocalDate validBirthday \u003d LocalDate.now().minusYears(20); // 20 years ago","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" BirthdayAttribute birthdayAttribute \u003d new BirthdayAttribute(\"ValidBirthday\", validBirthday);","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" assertEquals(validBirthday, birthdayAttribute.getValue(),","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" \"Birthday should be set correctly for dates before today\");","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" public void testInvalidBirthdayToday() {","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" // Test with today\u0027s date","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" LocalDate today \u003d LocalDate.now();","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e {","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" new BirthdayAttribute(\"BirthdayToday\", today);","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":" }, \"Should throw IllegalArgumentException for birthdays set to today\");","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"Bandov"},"content":" public void testInvalidBirthdayInFuture() {","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"Bandov"},"content":" // Test with a future date","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"Bandov"},"content":" LocalDate futureDate \u003d LocalDate.now().plusDays(1); // Tomorrow","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"Bandov"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e {","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"Bandov"},"content":" new BirthdayAttribute(\"FutureBirthday\", futureDate);","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"Bandov"},"content":" }, \"Should throw IllegalArgumentException for future birthdays\");","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":38}},{"path":"src/test/java/seedu/address/model/person/DateAttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"import java.time.LocalDate;","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":"public class DateAttributeTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" public void testConstructor() {","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" LocalDate testDate \u003d LocalDate.of(2020, 1, 1);","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" DateAttribute dateAttribute \u003d new DateAttribute(\"TestDate\", testDate);","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestDate\", dateAttribute.getName(), \"Constructor should correctly set name\");","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" assertEquals(testDate, dateAttribute.getValue(), \"Constructor should correctly set date value\");","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" public void testGetValueAsString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" LocalDate testDate \u003d LocalDate.of(2020, 2, 20);","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" DateAttribute dateAttribute \u003d new DateAttribute(\"TestDateAsString\", testDate);","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":" assertEquals(\"2020-02-20\", dateAttribute.getValueAsString(),","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" \"getValueAsString should return correct date string\");","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"Bandov"},"content":" public void testIsOnDate() {","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"Bandov"},"content":" LocalDate testDate \u003d LocalDate.of(2021, 3, 15);","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"Bandov"},"content":" DateAttribute dateAttribute \u003d new DateAttribute(\"TestIsOnDate\", testDate);","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"Bandov"},"content":" // Test with the same date","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"Bandov"},"content":" assertTrue(dateAttribute.isOnDate(LocalDate.of(2021, 3, 15)),","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"Bandov"},"content":" \"isOnDate should return true for the same date\");","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"Bandov"},"content":" // Test with a different date","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"Bandov"},"content":" assertFalse(dateAttribute.isOnDate(LocalDate.of(2021, 3, 14)),","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"Bandov"},"content":" \"isOnDate should return false for a different date\");","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":43}},{"path":"src/test/java/seedu/address/model/person/IntegerAttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":"public class IntegerAttributeTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" private IntegerAttribute attributeOne;","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" private IntegerAttribute attributeTwo;","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" private IntegerAttribute attributeThree;","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" @BeforeEach","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" public void setUp() {","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" attributeOne \u003d new IntegerAttribute(\"TestAttributeOne\", 5);","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" attributeTwo \u003d new IntegerAttribute(\"TestAttributeTwo\", 10);","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" attributeThree \u003d new IntegerAttribute(\"TestAttributeThree\", 5);","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" public void testGetValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" assertEquals(5, attributeOne.getValue());","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":" assertEquals(10, attributeTwo.getValue());","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"Bandov"},"content":" public void testGetValueAsString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"Bandov"},"content":" assertEquals(\"5\", attributeOne.getValueAsString());","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"Bandov"},"content":" assertEquals(\"10\", attributeTwo.getValueAsString());","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"Bandov"},"content":" public void testCompare() {","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"Bandov"},"content":" assertEquals(0, attributeOne.compare(attributeThree)); // same value","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"Bandov"},"content":" assertTrue(attributeOne.compare(attributeTwo) \u003c 0); // attributeOne \u003c attributeTwo","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"Bandov"},"content":" assertTrue(attributeTwo.compare(attributeOne) \u003e 0); // attributeTwo \u003e attributeOne","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"Bandov"},"content":" public void testConstructor() {","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestAttributeOne\", attributeOne.getName()); //test the getName method","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"Bandov"},"content":" assertEquals(5, attributeOne.getValue());","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":47}},{"path":"src/test/java/seedu/address/model/person/NameAttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"public class NameAttributeTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" public void testConstructor() {","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" // Given name and value for the NameAttribute","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" String attributeName \u003d \"FullName\";","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" String attributeValue \u003d \"John Doe\";","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" // When creating a new NameAttribute","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" NameAttribute nameAttribute \u003d new NameAttribute(attributeName, attributeValue);","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" // Then the name and value should be correctly set","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" assertEquals(attributeName, nameAttribute.getName(), \"Attribute name should be correctly set by constructor\");","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" assertEquals(attributeValue, nameAttribute.getValue(), \"Name value should be correctly set by constructor\");","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":23}},{"path":"src/test/java/seedu/address/model/person/PhoneNumberAttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"public class PhoneNumberAttributeTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" public void testConstructor() {","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" // Example phone number","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" int phoneNumberValue \u003d 123456789;","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" PhoneNumberAttribute phoneNumberAttribute \u003d new PhoneNumberAttribute(\"TestPhone\", phoneNumberValue);","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestPhone\", phoneNumberAttribute.getName(),","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" \"Name should be correctly set by constructor\");","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" assertEquals(phoneNumberValue, phoneNumberAttribute.getValue(),","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" \"Phone number value should be correctly set by constructor\");","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":21}},{"path":"src/test/java/seedu/address/model/person/SexAttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"public class SexAttributeTest {","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" public void testConstructorAndGetter() {","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":" SexAttribute maleSexAttribute \u003d new SexAttribute(\"Gender\", SexAttribute.Gender.MALE);","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" assertEquals(SexAttribute.Gender.MALE, maleSexAttribute.getGender(),","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" \"Constructor should correctly set gender to MALE\");","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" SexAttribute femaleSexAttribute \u003d new SexAttribute(\"Gender\", SexAttribute.Gender.FEMALE);","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" assertEquals(SexAttribute.Gender.FEMALE, femaleSexAttribute.getGender(),","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":" \"Constructor should correctly set gender to FEMALE\");","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" public void testGetValueAsString() {","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" SexAttribute sexAttribute \u003d new SexAttribute(\"Gender\", SexAttribute.Gender.MALE);","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":" assertEquals(\"MALE\", sexAttribute.getValueAsString(),","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" \"getValueAsString should return \u0027MALE\u0027 for male gender\");","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" sexAttribute.setGender(SexAttribute.Gender.FEMALE);","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":" assertEquals(\"FEMALE\", sexAttribute.getValueAsString(),","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":" \"getValueAsString should return \u0027FEMALE\u0027 after setting gender to female\");","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"Bandov"},"content":" public void testSetGender() {","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"Bandov"},"content":" SexAttribute sexAttribute \u003d new SexAttribute(\"Gender\", SexAttribute.Gender.MALE);","lastModifiedDate":"2024-03-10"},{"lineNumber":34,"author":{"gitId":"Bandov"},"content":" sexAttribute.setGender(SexAttribute.Gender.FEMALE);","lastModifiedDate":"2024-03-10"},{"lineNumber":35,"author":{"gitId":"Bandov"},"content":" assertEquals(SexAttribute.Gender.FEMALE, sexAttribute.getGender(),","lastModifiedDate":"2024-03-10"},{"lineNumber":36,"author":{"gitId":"Bandov"},"content":" \"setGender should correctly change gender to FEMALE\");","lastModifiedDate":"2024-03-10"},{"lineNumber":37,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":38,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-03-10"},{"lineNumber":39,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-03-10"}],"authorContributionMap":{"Bandov":39}},{"path":"src/test/java/seedu/address/model/person/StringAttributeTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Bandov"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"Bandov"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"Bandov"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"Bandov"},"content":"public class StringAttributeTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"Bandov"},"content":" private StringAttribute stringAttributeOne;","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"Bandov"},"content":" private StringAttribute stringAttributeTwo;","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"Bandov"},"content":" @BeforeEach","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"Bandov"},"content":" public void setUp() {","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"Bandov"},"content":" stringAttributeOne \u003d new StringAttribute(\"TestAttributeOne\", \"TestValueOne\");","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"Bandov"},"content":" stringAttributeTwo \u003d new StringAttribute(\"TestAttributeTwo\", \"TestValueTwo\");","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"Bandov"},"content":" public void getValue_returnsCorrectValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestValueOne\", stringAttributeOne.getValue());","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestValueTwo\", stringAttributeTwo.getValue());","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"Bandov"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"Bandov"},"content":" public void getValueAsString_returnsCorrectValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestValueOne\", stringAttributeOne.getValueAsString());","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"Bandov"},"content":" assertEquals(\"TestValueTwo\", stringAttributeTwo.getValueAsString());","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"Bandov"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"Bandov"},"content":" @Test void matches_returnsCorrectValue() {","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"Bandov"},"content":" assertEquals(true, stringAttributeOne.matches(\"Test\"));","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"Bandov"},"content":" assertEquals(false, stringAttributeOne.matches(\"TestValueTwo\"));","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"Bandov"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"Bandov"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"Bandov":34}}] diff --git a/AY2324S2-CS2103T-T11-1_tp_master/commits.json b/AY2324S2-CS2103T-T11-1_tp_master/commits.json index 33069746..6dd29241 100644 --- a/AY2324S2-CS2103T-T11-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T11-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"ReflectiveObsidian":[{"date":"2024-02-28","commitResults":[{"hash":"f848e2e72db7f7c40c8490afa656f3380c0a9404","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"(cherry picked from commit 558ff38a7c87123d43b3ea9c33d3c691416842aa)\n","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":2}}},{"hash":"0deac2b9aa7ab51525495650971fafbac02251ec","isMergeCommit":false,"messageTitle":"Update README.md to include library use","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}},{"hash":"35746df42787d8e1fa35ffc3a55e04c247d3417f","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":5}}}]},{"date":"2024-03-01","commitResults":[{"hash":"a097ae443dbd65c6b15c87a09e63509b270c0c90","isMergeCommit":false,"messageTitle":"Add info about ReflectiveObsidian to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":6}}}]},{"date":"2024-03-03","commitResults":[{"hash":"986755d73745d96abecdc182099b0354e3ddccc1","isMergeCommit":false,"messageTitle":"Update info about ReflectiveObsidian","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"424674ad27467de436758ea5e477db766330659e","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ReflectiveObsidian/about-us","messageBody":"Add profile photo and info about ReflectiveObsidian to AboutUs","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"5dd9e7f2d0c73d5ff034780179de2c0407dedd4c","isMergeCommit":false,"messageTitle":"Fix wrong photo name of ReflectiveObsidian","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c46800dd2775c17b012ae451ab7ea812853b4ad1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7d82a6d7bcdc307d279ba01a99b538b6b8037557","isMergeCommit":true,"messageTitle":"Merge pull request #26 from ReflectiveObsidian/about-us","messageBody":"Fix wrong photo name of ReflectiveObsidian","fileTypesAndContributionMap":{}}]}],"DingBao-sys":[{"date":"2024-03-07","commitResults":[{"hash":"494d682b342e404129f491b9ba80bda29a0f6cf0","isMergeCommit":true,"messageTitle":"Merge pull request #22 from Tsenrae/branch-About-Us","messageBody":"Add profile photo and info about Tsenrae to about us","fileTypesAndContributionMap":{}},{"hash":"2c9e39fdc419b4605d9a67816deb3b22019f5e6e","isMergeCommit":false,"messageTitle":"Correct invalid image names, slightly format markdown files","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":15}}},{"hash":"94bcb62f1a733717ea503b72a4579565efe381ef","isMergeCommit":false,"messageTitle":"correct png names, edited AboutUs.md to include correct information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":44}}}]}],"Bandov":[{"date":"2024-02-23","commitResults":[{"hash":"509e431bbd2fd88f49132a2bd3da184592c165d3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}}]},{"date":"2024-02-29","commitResults":[{"hash":"ae5b18ab82cdba446802eab909bc35e0814dbce3","isMergeCommit":false,"messageTitle":"added user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}}]},{"date":"2024-03-01","commitResults":[{"hash":"bc9522d2182e4e9bd4f797215ce4ebd2ef9096df","isMergeCommit":false,"messageTitle":"Adding AboutUs information about Bandov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}}]},{"date":"2024-03-04","commitResults":[{"hash":"0792c0cd0846b348cacf0ed9ea1d35864edbefc1","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Bandov/Add-profile-photo-and-info-about-Bandov-to-AboutUs","messageBody":"Add profile photo and info about bandov to about us","fileTypesAndContributionMap":{}},{"hash":"d2a04da86f1c1547b53d3095b9a5b4b1c5b4d5de","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Emberlynn-Loo/Branch-Use-Cases","messageBody":"Add Use Cases","fileTypesAndContributionMap":{}},{"hash":"210134820370bd6cea94660b4e1b874cc13ec710","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Tsenrae/branch-NFRs","messageBody":"Add Non-Functional Requirements","fileTypesAndContributionMap":{}},{"hash":"8431d16fe2b2966d94e42034df37fe865fe37250","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ReflectiveObsidian/branch-ReadmeJekyll","messageBody":"Update Readme and Project Page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f22b1059196046b762d87194f15109955e860828","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bb068f52107f62d212bde55a446457db668c2fe4","isMergeCommit":true,"messageTitle":"Merge pull request #27 from DingBao-sys/branch-AboutUs","messageBody":"Finalise AboutUs.md","fileTypesAndContributionMap":{}}]}],"Tsenrae":[{"date":"2024-03-03","commitResults":[{"hash":"9c8857c8363e64c9b4abe7d7288021f9c3dd46ce","isMergeCommit":false,"messageTitle":"Add Non-Functional Requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"97969179b57dbbdbaae54cb0b3a82092b67ffeb3","isMergeCommit":false,"messageTitle":"Add profile photo and info about Tsenrae to about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}],"Emberlynn-Loo":[{"date":"2024-03-03","commitResults":[{"hash":"86829fbd9fa4d44c1d0be846d1e3177e5d4448b7","isMergeCommit":false,"messageTitle":"Add Use Cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":354,"deletions":8}}}]},{"date":"2024-03-07","commitResults":[{"hash":"b84a26fb13bdf494d2b121c19406f0530176cf76","isMergeCommit":false,"messageTitle":"Update profile picture and information about Emberlynn","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"f550b96ebfe53f735209389c6e42506c00293d12","isMergeCommit":true,"messageTitle":"Merge pull request #25 from Emberlynn-Loo/Branch-AboutUs","messageBody":"Update profile picture and information about Emberlynn","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"ReflectiveObsidian":{"docs":24,"functional-code":0,"test-code":0,"other":1},"DingBao-sys":{"docs":12,"functional-code":0,"test-code":0},"Bandov":{"docs":15,"functional-code":0,"test-code":0},"Tsenrae":{"docs":9,"functional-code":0,"test-code":0},"Emberlynn-Loo":{"docs":350,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ReflectiveObsidian":65.98221,"DingBao-sys":398.2222,"Bandov":60.64888,"Tsenrae":10.560001,"Emberlynn-Loo":8129.928},"authorDisplayNameMap":{"ReflectiveObsidian":"CS2103T-T11-1 NG W..MING","DingBao-sys":"CS2103T-T11-1 SIM .. HAO","Bandov":"CS2103T-T11-1 SONG..INIC","Tsenrae":"CS2103T-T11-1 EARN..APMO","Emberlynn-Loo":"CS2103T-T11-1 EMBE..UI-E"}} +{"authorDailyContributionsMap":{"ReflectiveObsidian":[{"date":"2024-02-28","commitResults":[{"hash":"f848e2e72db7f7c40c8490afa656f3380c0a9404","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"(cherry picked from commit 558ff38a7c87123d43b3ea9c33d3c691416842aa)\n","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":2}}},{"hash":"0deac2b9aa7ab51525495650971fafbac02251ec","isMergeCommit":false,"messageTitle":"Update README.md to include library use","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}},{"hash":"35746df42787d8e1fa35ffc3a55e04c247d3417f","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":5}}}]},{"date":"2024-03-01","commitResults":[{"hash":"a097ae443dbd65c6b15c87a09e63509b270c0c90","isMergeCommit":false,"messageTitle":"Add info about ReflectiveObsidian to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":6}}}]},{"date":"2024-03-03","commitResults":[{"hash":"986755d73745d96abecdc182099b0354e3ddccc1","isMergeCommit":false,"messageTitle":"Update info about ReflectiveObsidian","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"424674ad27467de436758ea5e477db766330659e","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ReflectiveObsidian/about-us","messageBody":"Add profile photo and info about ReflectiveObsidian to AboutUs","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"5dd9e7f2d0c73d5ff034780179de2c0407dedd4c","isMergeCommit":false,"messageTitle":"Fix wrong photo name of ReflectiveObsidian","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c46800dd2775c17b012ae451ab7ea812853b4ad1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7d82a6d7bcdc307d279ba01a99b538b6b8037557","isMergeCommit":true,"messageTitle":"Merge pull request #26 from ReflectiveObsidian/about-us","messageBody":"Fix wrong photo name of ReflectiveObsidian","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"b3e0ff819b57643cca2a47993152ee1596656770","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Bandov/Developer-Guide-User-Stories","messageBody":"Add attribute relationship","fileTypesAndContributionMap":{}}]}],"DingBao-sys":[{"date":"2024-03-07","commitResults":[{"hash":"494d682b342e404129f491b9ba80bda29a0f6cf0","isMergeCommit":true,"messageTitle":"Merge pull request #22 from Tsenrae/branch-About-Us","messageBody":"Add profile photo and info about Tsenrae to about us","fileTypesAndContributionMap":{}},{"hash":"2c9e39fdc419b4605d9a67816deb3b22019f5e6e","isMergeCommit":false,"messageTitle":"Correct invalid image names, slightly format markdown files","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":15}}},{"hash":"94bcb62f1a733717ea503b72a4579565efe381ef","isMergeCommit":false,"messageTitle":"correct png names, edited AboutUs.md to include correct information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":44}}}]}],"Bandov":[{"date":"2024-02-23","commitResults":[{"hash":"509e431bbd2fd88f49132a2bd3da184592c165d3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}}]},{"date":"2024-02-27","commitResults":[{"hash":"f353e86b35dfb793d05dd2a064751caf54e24f01","isMergeCommit":false,"messageTitle":"Add template code for Relationship and Attribute","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":60,"deletions":0}}},{"hash":"b35d03a07be1dbaa30a3adf3716775de6d99efba","isMergeCommit":false,"messageTitle":"fixed import and checkstyle issues for skeleton code","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":8}}}]},{"date":"2024-02-28","commitResults":[{"hash":"828f5095b1a2dc6fede75cc3cf68c4821524d386","isMergeCommit":false,"messageTitle":"Removed Relationship and added unit tests","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":156,"deletions":38},"test-code":{"insertions":322,"deletions":0}}}]},{"date":"2024-02-29","commitResults":[{"hash":"3ddfb54929e4cea17b04b3c2069ef8bb0d21340c","isMergeCommit":false,"messageTitle":"added to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}},{"hash":"ae5b18ab82cdba446802eab909bc35e0814dbce3","isMergeCommit":false,"messageTitle":"added user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}}]},{"date":"2024-03-01","commitResults":[{"hash":"bc9522d2182e4e9bd4f797215ce4ebd2ef9096df","isMergeCommit":false,"messageTitle":"Adding AboutUs information about Bandov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}}]},{"date":"2024-03-04","commitResults":[{"hash":"0792c0cd0846b348cacf0ed9ea1d35864edbefc1","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Bandov/Add-profile-photo-and-info-about-Bandov-to-AboutUs","messageBody":"Add profile photo and info about bandov to about us","fileTypesAndContributionMap":{}},{"hash":"d2a04da86f1c1547b53d3095b9a5b4b1c5b4d5de","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Emberlynn-Loo/Branch-Use-Cases","messageBody":"Add Use Cases","fileTypesAndContributionMap":{}},{"hash":"210134820370bd6cea94660b4e1b874cc13ec710","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Tsenrae/branch-NFRs","messageBody":"Add Non-Functional Requirements","fileTypesAndContributionMap":{}},{"hash":"8431d16fe2b2966d94e42034df37fe865fe37250","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ReflectiveObsidian/branch-ReadmeJekyll","messageBody":"Update Readme and Project Page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f22b1059196046b762d87194f15109955e860828","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bb068f52107f62d212bde55a446457db668c2fe4","isMergeCommit":true,"messageTitle":"Merge pull request #27 from DingBao-sys/branch-AboutUs","messageBody":"Finalise AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"45386dd509d09e0d311b18a76ecd1345ed343e2b","isMergeCommit":false,"messageTitle":"changed genderAttribute to sexAttribute, removed birthday attribute","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":11},"other":{"insertions":2,"deletions":2},"test-code":{"insertions":39,"deletions":76}}},{"hash":"c1e502856894fc923fc1958d372627dcae1299b2","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Developer-Guide-User-Stories","messageBody":"","fileTypesAndContributionMap":{}}]}],"Tsenrae":[{"date":"2024-03-03","commitResults":[{"hash":"9c8857c8363e64c9b4abe7d7288021f9c3dd46ce","isMergeCommit":false,"messageTitle":"Add Non-Functional Requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"97969179b57dbbdbaae54cb0b3a82092b67ffeb3","isMergeCommit":false,"messageTitle":"Add profile photo and info about Tsenrae to about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}],"Emberlynn-Loo":[{"date":"2024-03-03","commitResults":[{"hash":"86829fbd9fa4d44c1d0be846d1e3177e5d4448b7","isMergeCommit":false,"messageTitle":"Add Use Cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":354,"deletions":8}}}]},{"date":"2024-03-07","commitResults":[{"hash":"b84a26fb13bdf494d2b121c19406f0530176cf76","isMergeCommit":false,"messageTitle":"Update profile picture and information about Emberlynn","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"f550b96ebfe53f735209389c6e42506c00293d12","isMergeCommit":true,"messageTitle":"Merge pull request #25 from Emberlynn-Loo/Branch-AboutUs","messageBody":"Update profile picture and information about Emberlynn","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"ReflectiveObsidian":{"docs":24,"functional-code":0,"test-code":0,"other":1},"DingBao-sys":{"docs":12,"functional-code":0,"test-code":0},"Bandov":{"docs":15,"functional-code":160,"test-code":285},"Tsenrae":{"docs":9,"functional-code":0,"test-code":0},"Emberlynn-Loo":{"docs":350,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ReflectiveObsidian":59.23876,"DingBao-sys":354.32532,"Bandov":14951.826,"Tsenrae":9.467128,"Emberlynn-Loo":7236.969},"authorDisplayNameMap":{"ReflectiveObsidian":"CS2103T-T11-1 NG W..MING","DingBao-sys":"CS2103T-T11-1 SIM .. HAO","Bandov":"CS2103T-T11-1 SONG..INIC","Tsenrae":"CS2103T-T11-1 EARN..APMO","Emberlynn-Loo":"CS2103T-T11-1 EMBE..UI-E"}} diff --git a/AY2324S2-CS2103T-T11-4_tp_master/authorship.json b/AY2324S2-CS2103T-T11-4_tp_master/authorship.json index fc6584a4..eb0fb8f8 100644 --- a/AY2324S2-CS2103T-T11-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T11-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yyccbb"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp/graph/badge.svg?token\u003dYS8FHD1IQM)](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"yyccbb"},"content":"* **TrAcker** is a student software engineering project that aims to create an application to help Head Teaching","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"yyccbb"},"content":" Assistants (Head TAs) track the records of other Teaching Assistants (TAs) and students.","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"yyccbb"},"content":" * Add/delete contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"yyccbb"},"content":" * Update contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"yyccbb"},"content":" * Edit tags which reflect the attendance of students","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"yyccbb"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"yyccbb"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":8,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"### Ho Kai Ting","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":"\u003cimg src\u003d\"images/kaitinghh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":"[[github](https://github.com/kaitinghh)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"[[portfolio](team/kaitinghh.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"### Wang Xinrong","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/wang-xinrong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/wang-xinrong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":"[[portfolio](team/wangxinrong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"wongkj12"},"content":"### Wong Kai Jie","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"wongkj12"},"content":"\u003cimg src\u003d\"images/wongkj12.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"wongkj12"},"content":"[[github](http://github.com/wongkj12)] [[portfolio](team/wongkj12.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"### Yong Kotaro","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/yongkotaro.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/yongkotaro)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"wang-xinrong"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"yyccbb"},"content":"### Yu Chenbo","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"yyccbb"},"content":"\u003cimg src\u003d\"images/yyccbb.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"yyccbb"},"content":"[[github](http://github.com/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"yyccbb"},"content":"[[portfolio](team/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yyccbb"},"content":"* Responsibilities: Project Structure","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":5,"wongkj12":3,"kaitinghh":6,"wang-xinrong":9,"-":35}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"kaitinghh"},"content":"|----------|----------------------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | mark students\u0027 attendance | view attendance records easily in the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | edit a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | search for specific contacts | easily retrieve the contact info of a student/tutor if I need to contact them. |","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | have a basic GUI to interact with | use the app conveniently instead of in shell/terminal. |","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | send group emails to students/tutors | save time on gathering email addresses. |","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | organize students into classes | separate records for students from different classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":290,"author":{"gitId":"kaitinghh"},"content":"| `* *` | beginner user | access a user guide | understand the functions of the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"kaitinghh"},"content":"| `* *` | potential user exploring the app | see the app populated with sample data | get an idea of how the app is used. |","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | filter contacts with relevant keywords or tags | access records relevant to a specific keyword quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect the commands to be common-sensical | pick up the app at speed. |","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect warnings to be given to irreversible actions such as batch delete contacts | will not lose my data out of unfamiliarity with the commands. |","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"kaitinghh"},"content":"| `* *` | frequent user | batch edit contacts | make similar changes to a large number of contacts quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | see which tutors are available | quickly allocate them for replacement tutoring. |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | have a sleek and simple UI | use the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | track students\u0027 assignment progress | follow up if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | edit tags | easily customise existing tags for my use case. |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | export data in .xlsx | share records with other tutors. |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | create shortcuts for specific commands | perform the usual tasks quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"kaitinghh"},"content":"| `*` | user with lots of data stored | batch imports to have a timestamp | easily locate certain information based on import time, or batch delete them when obsolete. |","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"kaitinghh"},"content":"| `*` | novice user | accessible help page to remind me of command keywords | carry out tasks quickly even without remembering the command keywords. |","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"kaitinghh"},"content":"| `*` | user | generate attendance reports of the students | see who has been skipping classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"kaitinghh"},"content":"| `*` | busy user | receive reminders for upcoming classes | keep track of my upcoming lessons. |","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"kaitinghh"},"content":"| `*` | impatient user | use the app offline | use the app even when the connection is poor. |","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | be able to access already executed commands | execute them again when needed without having to type everything again. |","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | see a list of suggested commands after having typed the initial letters of a keyword | quickly select a command to complete and it is less likely that I misspell a command. |","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"kaitinghh"},"content":"| `*` | beginner user | GUI to be simple and self-explanatory | get familiar with the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"wang-xinrong"},"content":"(For all use cases below, the **System** is the `TrAcker`, the **Actor** is the `user` and **persons** can be both a student and a TA unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of persons","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"wang-xinrong"},"content":" * 3a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to add a person with relevant entries such as name, phone number and email","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker adds the entry to its contact list","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"wang-xinrong"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Search a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to search a contact by keywords (for names)","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of contacts whose names match the keywords","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"wang-xinrong"},"content":"* 1a. No contacts have names including the specified keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"wang-xinrong"},"content":" *1a1. TrAcker shows an empty list","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Edit a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to edit a contact with new information","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker updates the contact with specified new information","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs new information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"wongkj12"},"content":"1. **(Technical)** Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"wongkj12"},"content":"2. **(Quality)** A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"wongkj12"},"content":"3. **(Quality)** The user interface and commands should be intuitive and user-friendly, requiring minimal time to learn.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"wongkj12"},"content":"4. **(Quality)** The app should provide clear and informative error messages in case of invalid inputs or command failures.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"wongkj12"},"content":"5. **(Performance)** The app should respond to user actions within 0.5 seconds, ensuring smooth navigation and interaction.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"wongkj12"},"content":"6. **(Performance)** The app should be able to support at minimum a contacts list of 200 without affecting performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"wongkj12"},"content":"7. **(Performance)** The app should be able to run smoothly even on low-end hardware configurations.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"wongkj12"},"content":"8. **(Process)** The project is expected to adhere to a schedule that adds updates incrementally at least once every two weeks.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"wongkj12"},"content":"9. **(Project scope)** The product should be focused on the needs of our target user, head teaching assistants.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"wongkj12"},"content":"10. **(Documentation)** Comprehensive user guide should be provided, with detailed instructions on how to use each command.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"wongkj12"},"content":"11. **(Documentation)** Comprehensive developer guide should be created to facilitate ongoing maintenance of the app.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":408,"author":{"gitId":"yongkotaro"},"content":"* **Tutor**: A teaching assistant for CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"yongkotaro"},"content":"* **Student**: A student taking CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"yongkotaro"},"content":"* **Tag**: A label that can be attached to the student. It is used to mark the attendance for a specific week.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"yongkotaro"},"content":"* **Attendance Status**: The current state of a student\u0027s attendance. ","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"yongkotaro"},"content":"* **Contact Entry**: Contact information of either a student or a tutor, containing the name, phone number, email, and attendance status.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":11,"yongkotaro":5,"kaitinghh":33,"wang-xinrong":51,"-":365}},{"path":"docs/team/kaitinghh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"kaitinghh"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"kaitinghh"},"content":"title: Ho Kai Ting\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"kaitinghh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"kaitinghh"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kaitinghh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"kaitinghh"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kaitinghh"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"kaitinghh"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"kaitinghh"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"kaitinghh"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"kaitinghh"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"kaitinghh"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"kaitinghh"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"kaitinghh"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"kaitinghh"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"kaitinghh"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"kaitinghh"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"kaitinghh"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"kaitinghh"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"kaitinghh"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"kaitinghh"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"kaitinghh"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"kaitinghh"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"kaitinghh"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"kaitinghh"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"kaitinghh"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"kaitinghh"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"kaitinghh":46}},{"path":"docs/team/wangxinrong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wang-xinrong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wang-xinrong"},"content":"title: Wang Xinrong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"wang-xinrong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"wang-xinrong"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"wang-xinrong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wang-xinrong"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"wang-xinrong"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"wang-xinrong"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"wang-xinrong"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"wang-xinrong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"wang-xinrong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"wang-xinrong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"wang-xinrong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"wang-xinrong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"wang-xinrong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"wang-xinrong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"wang-xinrong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"wang-xinrong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"wang-xinrong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"wang-xinrong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"wang-xinrong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"wang-xinrong"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"wang-xinrong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"wang-xinrong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wang-xinrong":46}},{"path":"docs/team/wongkj12.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"wongkj12"},"content":"title: Kai Jie\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":1,"-":45}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yyccbb"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp/graph/badge.svg?token\u003dYS8FHD1IQM)](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"yyccbb"},"content":"* **TrAcker** is a student software engineering project that aims to create an application to help Head Teaching","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"yyccbb"},"content":" Assistants (Head TAs) track the records of other Teaching Assistants (TAs) and students.","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"yyccbb"},"content":" * Add/delete contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"yyccbb"},"content":" * Update contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"yyccbb"},"content":" * Edit tags which reflect the attendance of students","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"yyccbb"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"yyccbb"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":8,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"### Ho Kai Ting","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":"\u003cimg src\u003d\"images/kaitinghh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":"[[github](https://github.com/kaitinghh)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"[[portfolio](team/kaitinghh.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"### Wang Xinrong","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/wang-xinrong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/wang-xinrong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":"[[portfolio](team/wangxinrong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"wongkj12"},"content":"### Wong Kai Jie","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"wongkj12"},"content":"\u003cimg src\u003d\"images/wongkj12.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"wongkj12"},"content":"[[github](http://github.com/wongkj12)] [[portfolio](team/wongkj12.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"### Yong Kotaro","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/yongkotaro.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/yongkotaro)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"wang-xinrong"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"yyccbb"},"content":"### Yu Chenbo","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"yyccbb"},"content":"\u003cimg src\u003d\"images/yyccbb.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"yyccbb"},"content":"[[github](http://github.com/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"yyccbb"},"content":"[[portfolio](team/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yyccbb"},"content":"* Responsibilities: Project Structure","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":5,"wongkj12":3,"kaitinghh":6,"wang-xinrong":9,"-":35}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"kaitinghh"},"content":"* head TA of CS2103T","lastModifiedDate":"2024-03-10"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"kaitinghh"},"content":"**Value proposition**: manage students and tutors faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-10"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"kaitinghh"},"content":"|----------|----------------------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | mark students\u0027 attendance | view attendance records easily in the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | edit a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | search for specific contacts | easily retrieve the contact info of a student/tutor if I need to contact them. |","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | have a basic GUI to interact with | use the app conveniently instead of in shell/terminal. |","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | send group emails to students/tutors | save time on gathering email addresses. |","lastModifiedDate":"2024-03-07"},{"lineNumber":290,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | organize students into classes | separate records for students from different classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"kaitinghh"},"content":"| `* *` | beginner user | access a user guide | understand the functions of the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"kaitinghh"},"content":"| `* *` | potential user exploring the app | see the app populated with sample data | get an idea of how the app is used. |","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | filter contacts with relevant keywords or tags | access records relevant to a specific keyword quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect the commands to be common-sensical | pick up the app at speed. |","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect warnings to be given to irreversible actions such as batch delete contacts | will not lose my data out of unfamiliarity with the commands. |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"kaitinghh"},"content":"| `* *` | frequent user | batch edit contacts | make similar changes to a large number of contacts quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | see which tutors are available | quickly allocate them for replacement tutoring. |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | have a sleek and simple UI | use the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | track students\u0027 assignment progress | follow up if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | edit tags | easily customise existing tags for my use case. |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | export data in .xlsx | share records with other tutors. |","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | create shortcuts for specific commands | perform the usual tasks quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"kaitinghh"},"content":"| `*` | user with lots of data stored | batch imports to have a timestamp | easily locate certain information based on import time, or batch delete them when obsolete. |","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"kaitinghh"},"content":"| `*` | novice user | accessible help page to remind me of command keywords | carry out tasks quickly even without remembering the command keywords. |","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"kaitinghh"},"content":"| `*` | user | generate attendance reports of the students | see who has been skipping classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"kaitinghh"},"content":"| `*` | busy user | receive reminders for upcoming classes | keep track of my upcoming lessons. |","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"kaitinghh"},"content":"| `*` | impatient user | use the app offline | use the app even when the connection is poor. |","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | be able to access already executed commands | execute them again when needed without having to type everything again. |","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | see a list of suggested commands after having typed the initial letters of a keyword | quickly select a command to complete and it is less likely that I misspell a command. |","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"kaitinghh"},"content":"| `*` | beginner user | GUI to be simple and self-explanatory | get familiar with the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"wang-xinrong"},"content":"(For all use cases below, the **System** is the `TrAcker`, the **Actor** is the `user` and **persons** can be both a student and a TA unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of persons","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"wang-xinrong"},"content":" * 3a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to add a person with relevant entries such as name, phone number and email","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker adds the entry to its contact list","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"wang-xinrong"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Search a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to search a contact by keywords (for names)","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of contacts whose names match the keywords","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"wang-xinrong"},"content":"* 1a. No contacts have names including the specified keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"wang-xinrong"},"content":" *1a1. TrAcker shows an empty list","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Edit a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to edit a contact with new information","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker updates the contact with specified new information","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs new information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"wongkj12"},"content":"1. **(Technical)** Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"wongkj12"},"content":"2. **(Quality)** A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"wongkj12"},"content":"3. **(Quality)** The user interface and commands should be intuitive and user-friendly, requiring minimal time to learn.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"wongkj12"},"content":"4. **(Quality)** The app should provide clear and informative error messages in case of invalid inputs or command failures.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"wongkj12"},"content":"5. **(Performance)** The app should respond to user actions within 0.5 seconds, ensuring smooth navigation and interaction.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"wongkj12"},"content":"6. **(Performance)** The app should be able to support at minimum a contacts list of 200 without affecting performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"wongkj12"},"content":"7. **(Performance)** The app should be able to run smoothly even on low-end hardware configurations.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"wongkj12"},"content":"8. **(Process)** The project is expected to adhere to a schedule that adds updates incrementally at least once every two weeks.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"wongkj12"},"content":"9. **(Project scope)** The product should be focused on the needs of our target user, head teaching assistants.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"wongkj12"},"content":"10. **(Documentation)** Comprehensive user guide should be provided, with detailed instructions on how to use each command.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"wongkj12"},"content":"11. **(Documentation)** Comprehensive developer guide should be created to facilitate ongoing maintenance of the app.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":409,"author":{"gitId":"yongkotaro"},"content":"* **Tutor**: A teaching assistant for CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"yongkotaro"},"content":"* **Student**: A student taking CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"yongkotaro"},"content":"* **Tag**: A label that can be attached to the student. It is used to mark the attendance for a specific week.","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"yongkotaro"},"content":"* **Attendance Status**: The current state of a student\u0027s attendance. ","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"yongkotaro"},"content":"* **Contact Entry**: Contact information of either a student or a tutor, containing the name, phone number, email, and attendance status.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":11,"yongkotaro":5,"kaitinghh":35,"wang-xinrong":51,"-":364}},{"path":"docs/team/kaitinghh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"kaitinghh"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"kaitinghh"},"content":"title: Ho Kai Ting\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"kaitinghh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"kaitinghh"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kaitinghh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"kaitinghh"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kaitinghh"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"kaitinghh"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"kaitinghh"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"kaitinghh"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"kaitinghh"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"kaitinghh"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"kaitinghh"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"kaitinghh"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"kaitinghh"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"kaitinghh"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"kaitinghh"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"kaitinghh"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"kaitinghh"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"kaitinghh"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"kaitinghh"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"kaitinghh"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"kaitinghh"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"kaitinghh"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"kaitinghh"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"kaitinghh"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"kaitinghh"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"kaitinghh":46}},{"path":"docs/team/wangxinrong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wang-xinrong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wang-xinrong"},"content":"title: Wang Xinrong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"wang-xinrong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"wang-xinrong"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"wang-xinrong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wang-xinrong"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"wang-xinrong"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"wang-xinrong"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"wang-xinrong"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"wang-xinrong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"wang-xinrong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"wang-xinrong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"wang-xinrong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"wang-xinrong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"wang-xinrong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"wang-xinrong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"wang-xinrong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"wang-xinrong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"wang-xinrong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"wang-xinrong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"wang-xinrong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"wang-xinrong"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"wang-xinrong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"wang-xinrong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wang-xinrong":46}},{"path":"docs/team/wongkj12.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"wongkj12"},"content":"title: Kai Jie\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":1,"-":45}}] diff --git a/AY2324S2-CS2103T-T11-4_tp_master/commits.json b/AY2324S2-CS2103T-T11-4_tp_master/commits.json index ef3e9be3..e65268f4 100644 --- a/AY2324S2-CS2103T-T11-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-T11-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"yyccbb":[{"date":"2024-03-07","commitResults":[{"hash":"854408b23784302201d826c0bbd298416ee6c193","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"da02b5d5a3b691cb987f5de5556acf7100daec5a","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yyccbb/master","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}},{"hash":"8c02784cc2708e4ada8f367b13cb216a9fec4fbc","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":10}}},{"hash":"e23b77addeab0009c5f585737c306ed51d862067","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"34affdd961128ef47b5ac050e01f0c3bc1a3c685","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"fbceaaa3ad70d134bac51f3b5758b4011634e2c3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c7032dafe0252e8ca92713c05d4957c2f8cb95a5","isMergeCommit":true,"messageTitle":"Merge pull request #20 from kaitinghh/master","messageBody":"Edit profile file names","fileTypesAndContributionMap":{}},{"hash":"08c905fa7e8e9972b895532c2801bcea019aeab1","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6c88853926ad85ef1033f84948efcaf6f9854742","isMergeCommit":true,"messageTitle":"Merge pull request #25 from yyccbb/update-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"wongkj12":[{"date":"2024-03-07","commitResults":[{"hash":"aa257a82b2e4d9977eba793e70c990a85abd0c52","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"054c052b0501b7a3c4316fa5e2ebaacb90c18d3e","isMergeCommit":false,"messageTitle":"Update and rename johndoe.md to wongkj12.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"99221c1c361b2eada630cea94c3ca4d47f3a368c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f7c0a4c34a17b9decf39a2b3dca4de2fb2d5cea4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"71f6fbce43f059534198014de304538cd8b60830","isMergeCommit":true,"messageTitle":"Merge pull request #8 from wang-xinrong/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"8d25f2f4f0a87faf72dcfeac7bae12bdb3c08dae","isMergeCommit":false,"messageTitle":"Update NFR in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":5}}},{"hash":"783b4ce87b8675167c4db083d9a54bfdac78e9a1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yongkotaro/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"yongkotaro":[{"date":"2024-03-07","commitResults":[{"hash":"d17e9c3af91e1facf670e7158338b6f9569ce95e","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"c9924fd97b9cb42e2e03b084932adb760067ac3f","isMergeCommit":false,"messageTitle":"Update DeveloperGuide","messageBody":"Update glossary to explain key terms used in our app.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"f575f22e848ee7eda850811fb97e33ff8d46a4ed","isMergeCommit":true,"messageTitle":"Merge pull request #15 from wongkj12/master","messageBody":"Update NFR in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f3c0efbc659dc016e2253ba0a331a9cc82b8df28","isMergeCommit":true,"messageTitle":"Merge pull request #16 from yyccbb/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"kaitinghh":[{"date":"2024-03-07","commitResults":[{"hash":"2c5acdad085d734bf052275bb97bdea33816edae","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1b1641ace2f7955c7604822961f30e17ddc489d5","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":10}}},{"hash":"90ceba68fa947b56b521b73e753251dc8586db0f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5ecda7e4e8139a5da54106d8b2961de0760442e8","isMergeCommit":true,"messageTitle":"Merge pull request #7 from kaitinghh/branch-AboutUs","messageBody":"Update AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"ff7e41ab2897882d71d701b911db522fe03087d2","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":10}}},{"hash":"18f6e4683f9c8c783861a0635cedb6ba00977ec7","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kaitinghh/branch-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"8b2a2eea9bb3aa4fb897397dc4c631838a957447","isMergeCommit":false,"messageTitle":"Edit profile file names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"wang-xinrong":[{"date":"2024-03-07","commitResults":[{"hash":"70cc0a3c7f837f7ee8da77816970f4fa80c45230","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"ebb592fb4a9331ed41bc2316b2cec15507a0b741","isMergeCommit":false,"messageTitle":"Add EOF line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"05bf798808882ccd3ed917bc38550a099e10b10d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"18065b5d8aea24073d320313f1feca20cc223c2c","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wongkj12/master","messageBody":"Update AboutUs wongkj12","fileTypesAndContributionMap":{}},{"hash":"9ac036eb387fea68dd1aee63df773a773a8dd571","isMergeCommit":false,"messageTitle":"Update GitHub Link in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4b6a66c0bc07c98bffcc47c819fd7f2577be69ce","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2165e1d01f46a053b4c964e6db4ca37ef63fbe35","isMergeCommit":true,"messageTitle":"Merge pull request #11 from yongkotaro/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"0132b31338f01137d27c496f40e2323a491b6f31","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3663250423a4c5d83990cb69c78a237815ce4798","isMergeCommit":false,"messageTitle":"Update DG use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":4}}},{"hash":"ea17de3d989b684b414282c7db25babd2e87b397","isMergeCommit":true,"messageTitle":"Merge pull request #17 from wang-xinrong/master","messageBody":"Update DG use cases","tags":["v1.1"],"fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"yyccbb":{"docs":13,"functional-code":0,"test-code":0},"wongkj12":{"docs":15,"functional-code":0,"test-code":0},"yongkotaro":{"docs":5,"functional-code":0,"test-code":0},"kaitinghh":{"docs":85,"functional-code":0,"test-code":0},"wang-xinrong":{"docs":106,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yyccbb":99.09334,"wongkj12":42.06222,"yongkotaro":14.0,"kaitinghh":863.18225,"wang-xinrong":972.2222},"authorDisplayNameMap":{"yyccbb":"CS2103T-T11-4 YU C..ENBO","wongkj12":"CS2103T-T11-4 WONG.. JIE","yongkotaro":"CS2103T-T11-4 YONG..TARO","kaitinghh":"CS2103T-T11-4 HO K..TING","wang-xinrong":"CS2103T-T11-4 WANG..RONG"}} +{"authorDailyContributionsMap":{"yyccbb":[{"date":"2024-03-07","commitResults":[{"hash":"854408b23784302201d826c0bbd298416ee6c193","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"da02b5d5a3b691cb987f5de5556acf7100daec5a","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yyccbb/master","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}},{"hash":"8c02784cc2708e4ada8f367b13cb216a9fec4fbc","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":10}}},{"hash":"e23b77addeab0009c5f585737c306ed51d862067","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"34affdd961128ef47b5ac050e01f0c3bc1a3c685","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"fbceaaa3ad70d134bac51f3b5758b4011634e2c3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c7032dafe0252e8ca92713c05d4957c2f8cb95a5","isMergeCommit":true,"messageTitle":"Merge pull request #20 from kaitinghh/master","messageBody":"Edit profile file names","fileTypesAndContributionMap":{}},{"hash":"08c905fa7e8e9972b895532c2801bcea019aeab1","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6c88853926ad85ef1033f84948efcaf6f9854742","isMergeCommit":true,"messageTitle":"Merge pull request #25 from yyccbb/update-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"74a40afece034d76ae618ae2409c0588c7030b47","isMergeCommit":true,"messageTitle":"Merge pull request #27 from wongkj12/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"8bd6cd97f3345657293c8dabaf596a450a60681e","isMergeCommit":true,"messageTitle":"Merge pull request #28 from kaitinghh/master","messageBody":"Update product scope","fileTypesAndContributionMap":{}}]}],"wongkj12":[{"date":"2024-03-07","commitResults":[{"hash":"aa257a82b2e4d9977eba793e70c990a85abd0c52","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"054c052b0501b7a3c4316fa5e2ebaacb90c18d3e","isMergeCommit":false,"messageTitle":"Update and rename johndoe.md to wongkj12.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"99221c1c361b2eada630cea94c3ca4d47f3a368c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f7c0a4c34a17b9decf39a2b3dca4de2fb2d5cea4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"71f6fbce43f059534198014de304538cd8b60830","isMergeCommit":true,"messageTitle":"Merge pull request #8 from wang-xinrong/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"8d25f2f4f0a87faf72dcfeac7bae12bdb3c08dae","isMergeCommit":false,"messageTitle":"Update NFR in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":5}}},{"hash":"783b4ce87b8675167c4db083d9a54bfdac78e9a1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yongkotaro/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"ab9fe74582bdf9e9e6162d7311d74aac8741cb18","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"yongkotaro":[{"date":"2024-03-07","commitResults":[{"hash":"d17e9c3af91e1facf670e7158338b6f9569ce95e","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"c9924fd97b9cb42e2e03b084932adb760067ac3f","isMergeCommit":false,"messageTitle":"Update DeveloperGuide","messageBody":"Update glossary to explain key terms used in our app.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"f575f22e848ee7eda850811fb97e33ff8d46a4ed","isMergeCommit":true,"messageTitle":"Merge pull request #15 from wongkj12/master","messageBody":"Update NFR in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f3c0efbc659dc016e2253ba0a331a9cc82b8df28","isMergeCommit":true,"messageTitle":"Merge pull request #16 from yyccbb/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"kaitinghh":[{"date":"2024-03-07","commitResults":[{"hash":"2c5acdad085d734bf052275bb97bdea33816edae","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1b1641ace2f7955c7604822961f30e17ddc489d5","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":10}}},{"hash":"90ceba68fa947b56b521b73e753251dc8586db0f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5ecda7e4e8139a5da54106d8b2961de0760442e8","isMergeCommit":true,"messageTitle":"Merge pull request #7 from kaitinghh/branch-AboutUs","messageBody":"Update AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"ff7e41ab2897882d71d701b911db522fe03087d2","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":10}}},{"hash":"18f6e4683f9c8c783861a0635cedb6ba00977ec7","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kaitinghh/branch-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"8b2a2eea9bb3aa4fb897397dc4c631838a957447","isMergeCommit":false,"messageTitle":"Edit profile file names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-10","commitResults":[{"hash":"ee7a94601acd24d554403ec88dcd6d22bb426a00","isMergeCommit":false,"messageTitle":"Update product scope","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"wang-xinrong":[{"date":"2024-03-07","commitResults":[{"hash":"70cc0a3c7f837f7ee8da77816970f4fa80c45230","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"ebb592fb4a9331ed41bc2316b2cec15507a0b741","isMergeCommit":false,"messageTitle":"Add EOF line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"05bf798808882ccd3ed917bc38550a099e10b10d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"18065b5d8aea24073d320313f1feca20cc223c2c","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wongkj12/master","messageBody":"Update AboutUs wongkj12","fileTypesAndContributionMap":{}},{"hash":"9ac036eb387fea68dd1aee63df773a773a8dd571","isMergeCommit":false,"messageTitle":"Update GitHub Link in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4b6a66c0bc07c98bffcc47c819fd7f2577be69ce","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2165e1d01f46a053b4c964e6db4ca37ef63fbe35","isMergeCommit":true,"messageTitle":"Merge pull request #11 from yongkotaro/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"0132b31338f01137d27c496f40e2323a491b6f31","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3663250423a4c5d83990cb69c78a237815ce4798","isMergeCommit":false,"messageTitle":"Update DG use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":4}}},{"hash":"ea17de3d989b684b414282c7db25babd2e87b397","isMergeCommit":true,"messageTitle":"Merge pull request #17 from wang-xinrong/master","messageBody":"Update DG use cases","tags":["v1.1"],"fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"yyccbb":{"docs":13,"functional-code":0,"test-code":0},"wongkj12":{"docs":15,"functional-code":0,"test-code":0},"yongkotaro":{"docs":5,"functional-code":0,"test-code":0},"kaitinghh":{"docs":87,"functional-code":0,"test-code":0},"wang-xinrong":{"docs":106,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yyccbb":88.24912,"wongkj12":37.2872,"yongkotaro":12.456748,"kaitinghh":766.4636,"wang-xinrong":865.0518},"authorDisplayNameMap":{"yyccbb":"CS2103T-T11-4 YU C..ENBO","wongkj12":"CS2103T-T11-4 WONG.. JIE","yongkotaro":"CS2103T-T11-4 YONG..TARO","kaitinghh":"CS2103T-T11-4 HO K..TING","wang-xinrong":"CS2103T-T11-4 WANG..RONG"}} diff --git a/AY2324S2-CS2103T-T14-2_tp_master/commits.json b/AY2324S2-CS2103T-T14-2_tp_master/commits.json index c1f6fff4..2c443454 100644 --- a/AY2324S2-CS2103T-T14-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T14-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"jskimdev":[{"date":"2024-03-06","commitResults":[{"hash":"bc88a10d930d159cf2fc80081f8fe5064fb4c44b","isMergeCommit":false,"messageTitle":"Update Junseo details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":18}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8e58e0688667d63e7e49ab56419b6200e7ce09c3","isMergeCommit":false,"messageTitle":"Add fifth member in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":1}}},{"hash":"a696da6f4cfb93ccd976425c88a624b03496fde6","isMergeCommit":false,"messageTitle":"Add empty line at the end AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bb8310dddc2c0cc7d4605183d96c45302c7e15b6","isMergeCommit":false,"messageTitle":"Remove unused fifth member in AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}},{"hash":"9d998cfeedfdd414b46f1a6fb4043417056ce09a","isMergeCommit":true,"messageTitle":"Merge pull request #11 from Vision-2000/branch-README-1","messageBody":"Update README.md with mock Ui image and our project content","fileTypesAndContributionMap":{}},{"hash":"752caf17bb608c213a05e7ff9268e892860549b0","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Vision-2000/branch-AboutUs-1","messageBody":"Update Eugene details in About Us page","fileTypesAndContributionMap":{}},{"hash":"b64fdc59ff6d02a611e983b7edc4944675bbad09","isMergeCommit":true,"messageTitle":"Merge pull request #14 from jeong-jaeho/branch-AboutUS-Jaeho","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}},{"hash":"e949b11b0bdaeabb3f22a4f200d1f2ae3f1773bd","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Vision-2000/branch-DeveloperGuide-1","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"S-Aishvarya":[{"date":"2024-03-07","commitResults":[{"hash":"f4bacae85feb883e0f8bf3890c7d4a6101a8906c","isMergeCommit":false,"messageTitle":"no message","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}}]}],"jeong-jaeho":[{"date":"2024-03-07","commitResults":[{"hash":"1b9cb2644803715aef687bfdc11ca1a6f08a5ef6","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"bca86dff2ff633f6c65924aaaba7f2d910713528","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"038e793283979f905fd1e9c5611d72c62d885743","isMergeCommit":true,"messageTitle":"Merge pull request #16 from S-Aishvarya/branch-AboutUs-Aishvarya","messageBody":"Update Aishvarya details in AboutUs page","fileTypesAndContributionMap":{}}]}],"Vision-2000":[{"date":"2024-03-06","commitResults":[{"hash":"92ebca6ca8eb0eed28742478ed841f5c1c84cdd8","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"66bc8733188bac87a8f69970f27933185fdbaa1e","isMergeCommit":true,"messageTitle":"Merge pull request #12 from jskimdev/branch-AboutUs","messageBody":"Update Junseo details in About Us page","fileTypesAndContributionMap":{}},{"hash":"e63466ad93e89a3e53a4fb50e8aac4705b7e09c4","isMergeCommit":false,"messageTitle":"Update Eugene details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"ba146c58767287e8d9c7cb22b9ea5ecca1248ac6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}},{"hash":"ccf6d400fb35640b7078b05174b63967a772c197","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Vision-2000/branch-README-2","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"ba214f35c54300822ece6a6bf384e00336be0d01","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":21}}}]}]},"authorFileTypeContributionMap":{"jskimdev":{"docs":7,"functional-code":0,"test-code":0},"S-Aishvarya":{"docs":4,"functional-code":0,"test-code":0},"jeong-jaeho":{"docs":3,"functional-code":0,"test-code":0},"Vision-2000":{"docs":106,"functional-code":0,"test-code":0}},"authorContributionVariance":{"jskimdev":86.025505,"S-Aishvarya":11.209183,"jeong-jaeho":4.244898,"Vision-2000":1311.495},"authorDisplayNameMap":{"jskimdev":"CS2103T-T14-2 KIM ..NSEO","S-Aishvarya":"CS2103T-T14-2 SIVA..ARYA","jeong-jaeho":"CS2103T-T14-2 JEON..AEHO","Vision-2000":"CS2103T-T14-2 EUGE..ROSE"}} +{"authorDailyContributionsMap":{"jskimdev":[{"date":"2024-03-06","commitResults":[{"hash":"bc88a10d930d159cf2fc80081f8fe5064fb4c44b","isMergeCommit":false,"messageTitle":"Update Junseo details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":18}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8e58e0688667d63e7e49ab56419b6200e7ce09c3","isMergeCommit":false,"messageTitle":"Add fifth member in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":1}}},{"hash":"a696da6f4cfb93ccd976425c88a624b03496fde6","isMergeCommit":false,"messageTitle":"Add empty line at the end AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bb8310dddc2c0cc7d4605183d96c45302c7e15b6","isMergeCommit":false,"messageTitle":"Remove unused fifth member in AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}},{"hash":"9d998cfeedfdd414b46f1a6fb4043417056ce09a","isMergeCommit":true,"messageTitle":"Merge pull request #11 from Vision-2000/branch-README-1","messageBody":"Update README.md with mock Ui image and our project content","fileTypesAndContributionMap":{}},{"hash":"752caf17bb608c213a05e7ff9268e892860549b0","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Vision-2000/branch-AboutUs-1","messageBody":"Update Eugene details in About Us page","fileTypesAndContributionMap":{}},{"hash":"b64fdc59ff6d02a611e983b7edc4944675bbad09","isMergeCommit":true,"messageTitle":"Merge pull request #14 from jeong-jaeho/branch-AboutUS-Jaeho","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}},{"hash":"e949b11b0bdaeabb3f22a4f200d1f2ae3f1773bd","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Vision-2000/branch-DeveloperGuide-1","messageBody":"Update DeveloperGuide.md","tags":["v1.1"],"fileTypesAndContributionMap":{}}]}],"S-Aishvarya":[{"date":"2024-03-07","commitResults":[{"hash":"f4bacae85feb883e0f8bf3890c7d4a6101a8906c","isMergeCommit":false,"messageTitle":"no message","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}}]}],"jeong-jaeho":[{"date":"2024-03-07","commitResults":[{"hash":"1b9cb2644803715aef687bfdc11ca1a6f08a5ef6","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"bca86dff2ff633f6c65924aaaba7f2d910713528","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"038e793283979f905fd1e9c5611d72c62d885743","isMergeCommit":true,"messageTitle":"Merge pull request #16 from S-Aishvarya/branch-AboutUs-Aishvarya","messageBody":"Update Aishvarya details in AboutUs page","fileTypesAndContributionMap":{}}]}],"Vision-2000":[{"date":"2024-03-06","commitResults":[{"hash":"92ebca6ca8eb0eed28742478ed841f5c1c84cdd8","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"66bc8733188bac87a8f69970f27933185fdbaa1e","isMergeCommit":true,"messageTitle":"Merge pull request #12 from jskimdev/branch-AboutUs","messageBody":"Update Junseo details in About Us page","fileTypesAndContributionMap":{}},{"hash":"e63466ad93e89a3e53a4fb50e8aac4705b7e09c4","isMergeCommit":false,"messageTitle":"Update Eugene details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"ba146c58767287e8d9c7cb22b9ea5ecca1248ac6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}},{"hash":"ccf6d400fb35640b7078b05174b63967a772c197","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Vision-2000/branch-README-2","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"ba214f35c54300822ece6a6bf384e00336be0d01","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":21}}}]}]},"authorFileTypeContributionMap":{"jskimdev":{"docs":7,"functional-code":0,"test-code":0},"S-Aishvarya":{"docs":4,"functional-code":0,"test-code":0},"jeong-jaeho":{"docs":3,"functional-code":0,"test-code":0},"Vision-2000":{"docs":106,"functional-code":0,"test-code":0}},"authorContributionVariance":{"jskimdev":86.025505,"S-Aishvarya":11.209183,"jeong-jaeho":4.244898,"Vision-2000":1311.495},"authorDisplayNameMap":{"jskimdev":"CS2103T-T14-2 KIM ..NSEO","S-Aishvarya":"CS2103T-T14-2 SIVA..ARYA","jeong-jaeho":"CS2103T-T14-2 JEON..AEHO","Vision-2000":"CS2103T-T14-2 EUGE..ROSE"}} diff --git a/AY2324S2-CS2103T-W08-3_tp_master/authorship.json b/AY2324S2-CS2103T-W08-3_tp_master/authorship.json index 423f25a9..213be2f0 100644 --- a/AY2324S2-CS2103T-W08-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W08-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp/graph/badge.svg?token\u003dNSJUXEXG4R)](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp)","lastModifiedDate":"2024-02-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"wilsonwid"},"content":"* This is **a project to help make us students able to easily to manage our contacts.**\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":" * recall a classmate\u0027s project role","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":" * schedule a meeting with a study group","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"* The project aims to alleviate the common challenge of remembering and managing the myriad of connections we accumulate, especially in academic and professional settings.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"wilsonwid"},"content":" * It is **written in an object-oriented programming (OOP) fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" * It provides a user and developer guide.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wilsonwid"},"content":"* It is named `Student Contact Manager` because it helps students to store contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ChuaZiLong"},"content":"* For the detailed documentation of this project, see the **[Student Contact Manager Website](https://ay2324s2-cs2103t-w08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"ChuaZiLong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":4,"-":5,"ChuaZiLong":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wilsonwid"},"content":"### Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wilsonwid"},"content":"\u003cimg src\u003d\"images/wilsonwid.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"wilsonwid"},"content":"[[github](https://github.com/wilsonwid)]","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"wilsonwid"},"content":"[[portfolio](team/wilsonwid.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"wilsonwid"},"content":"* Role: Team leader, Developer","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"wilsonwid"},"content":"* Responsibilities: Importing data, DevOps, User Guide, Developer Guide","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"ChuaZiLong"},"content":"### Chua Zi Long","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"ChuaZiLong"},"content":"\u003cimg src\u003d\"images/chuazilong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"ChuaZiLong"},"content":"[[github](https://github.com/ChuaZiLong)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"ChuaZiLong"},"content":"[[portfolio](team/zilong.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"ChuaZiLong"},"content":"* Responsibilities: README + Site-wide Settings + Exporting Data","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":6,"-":50,"ChuaZiLong":5}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wilsonwid"},"content":"* proficient with the use of a computer","lastModifiedDate":"2024-03-10"},{"lineNumber":283,"author":{"gitId":"wilsonwid"},"content":"* seeks an efficient way to manage a significant number of contacts within their academic and professional circles","lastModifiedDate":"2024-03-10"},{"lineNumber":284,"author":{"gitId":"wilsonwid"},"content":"* has a busy schedule","lastModifiedDate":"2024-03-10"},{"lineNumber":285,"author":{"gitId":"wilsonwid"},"content":"* desires an interactive and responsive app","lastModifiedDate":"2024-03-10"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"wilsonwid"},"content":"**Value proposition**: manage contacts and schedules faster and more effectively than with a normal scheduling app.","lastModifiedDate":"2024-03-10"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"wilsonwid"},"content":"| Priority | As a ... | I want to ... | So that I can ... |","lastModifiedDate":"2024-03-10"},{"lineNumber":294,"author":{"gitId":"wilsonwid"},"content":"|----------|--------------------------------------------|------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-10"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"ChuaZiLong"},"content":"3. Designed for users who can type fast, making command execution quicker than using a mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"wilsonwid"},"content":"4. All operations should be able to run within 500ms measured after user input has finished.","lastModifiedDate":"2024-03-10"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":352,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":353,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wilsonwid":8,"-":388,"ChuaZiLong":1}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"wilsonwid"},"content":"# Student Contact Manager User Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager is a student-designed app made for students who are in need of managing their daily activities.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wilsonwid"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"wilsonwid"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"wilsonwid"},"content":"Adds a person to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"wilsonwid"},"content":"Shows a list of all persons in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"wilsonwid"},"content":"Edits an existing person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"wilsonwid"},"content":"Deletes the specified person from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"wilsonwid"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"wilsonwid"},"content":"Clears all entries from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":166,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":171,"author":{"gitId":"wilsonwid"},"content":"If your changes to the data file makes its format invalid, Student Contact Manager will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"wilsonwid"},"content":"Furthermore, certain edits can cause Student Contact Manager to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":175,"author":{"gitId":"wilsonwid"},"content":"### Searching by a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"wilsonwid"},"content":"### Exporting data","lastModifiedDate":"2024-03-07"},{"lineNumber":178,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"wilsonwid"},"content":"### Importing data","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":181,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager allows importing of contact data from a JSON file.","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":183,"author":{"gitId":"wilsonwid"},"content":"Format: `import FILENAME1 [FILENAME2] [FILENAME3] ...`","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"wilsonwid"},"content":"Note: The imported file needs to be placed in the same directory as the main JSON save file.","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"wilsonwid"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"wilsonwid"},"content":"* `import save_file1`","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"wilsonwid"},"content":"* `import save_file1 save_file2`","lastModifiedDate":"2024-03-07"},{"lineNumber":190,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"wilsonwid"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Student Contact Manager home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":206,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":208,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":210,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wilsonwid":31,"-":189}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eStudent Contact Manager\u003c/a\u003e","lastModifiedDate":"2024-02-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W08-3/tp/tree/master\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"wilsonwid":1,"-":66}},{"path":"docs/team/wilsonwid.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wilsonwid"},"content":"# Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wilsonwid"},"content":"## Profile/Summary","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wilsonwid"},"content":"Hello there! I\u0027m Wilson, a 3rd year Computer Science and Data Science and Analytics Double Degree student at the National University of Singapore.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wilsonwid":4}},{"path":"docs/team/zilong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"# Chua Zi Long","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"ChuaZiLong"},"content":"## Profile/Summary","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"ChuaZiLong"},"content":"Current Year 2 Computer Science and Mathematics Double Degree student from the National University of Singapore.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"ChuaZiLong":4}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp/graph/badge.svg?token\u003dNSJUXEXG4R)](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp)","lastModifiedDate":"2024-02-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"wilsonwid"},"content":"* This is **a project to help make us students able to easily to manage our contacts.**\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":" * recall a classmate\u0027s project role","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":" * schedule a meeting with a study group","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"* The project aims to alleviate the common challenge of remembering and managing the myriad of connections we accumulate, especially in academic and professional settings.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"wilsonwid"},"content":" * It is **written in an object-oriented programming (OOP) fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" * It provides a user and developer guide.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wilsonwid"},"content":"* It is named `Student Contact Manager` because it helps students to store contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ChuaZiLong"},"content":"* For the detailed documentation of this project, see the **[Student Contact Manager Website](https://ay2324s2-cs2103t-w08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"ChuaZiLong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":4,"-":5,"ChuaZiLong":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wilsonwid"},"content":"### Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wilsonwid"},"content":"\u003cimg src\u003d\"images/wilsonwid.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"wilsonwid"},"content":"[[github](https://github.com/wilsonwid)]","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"wilsonwid"},"content":"[[portfolio](team/wilsonwid.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"wilsonwid"},"content":"* Role: Team leader, Developer","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"wilsonwid"},"content":"* Responsibilities: Importing data, DevOps, User Guide, Developer Guide","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"ChuaZiLong"},"content":"### Chua Zi Long","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"ChuaZiLong"},"content":"\u003cimg src\u003d\"images/chuazilong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"ChuaZiLong"},"content":"[[github](https://github.com/ChuaZiLong)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"ChuaZiLong"},"content":"[[portfolio](team/zilong.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"ChuaZiLong"},"content":"* Responsibilities: README + Site-wide Settings + Exporting Data","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":6,"-":50,"ChuaZiLong":5}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wilsonwid"},"content":"* proficient with the use of a computer","lastModifiedDate":"2024-03-10"},{"lineNumber":283,"author":{"gitId":"wilsonwid"},"content":"* seeks an efficient way to manage a significant number of contacts within their academic and professional circles","lastModifiedDate":"2024-03-10"},{"lineNumber":284,"author":{"gitId":"wilsonwid"},"content":"* has a busy schedule","lastModifiedDate":"2024-03-10"},{"lineNumber":285,"author":{"gitId":"wilsonwid"},"content":"* desires an interactive and responsive app","lastModifiedDate":"2024-03-10"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"wilsonwid"},"content":"**Value proposition**: manage contacts and schedules faster and more effectively than with a normal scheduling app.","lastModifiedDate":"2024-03-10"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"ChuaZiLong"},"content":"| `* * *` | user | search for a contact | find their information when I need it. |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"ChuaZiLong"},"content":"| `* * *` | user | import contact information | easily add multiple contacts at once. |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"ChuaZiLong"},"content":"| `* * *` | user | export contacts | easily integrate existing data. |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"ChuaZiLong"},"content":"**Use case: `find_by_tag`**","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"ChuaZiLong"},"content":"1. User requests to search for users by a specific tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"ChuaZiLong"},"content":"2. The application displays a list of users who are tagged with the specified tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"ChuaZiLong"},"content":"3. User reviews the list to find the desired contact(s).","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"ChuaZiLong"},"content":"2a. No users are found with the given tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"ChuaZiLong"},"content":"2a1. The application notifies the user that no contacts were found with the specified tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"ChuaZiLong"},"content":"1a. The user enters extra spaces before or after the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"ChuaZiLong"},"content":"1a1. The application automatically trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"ChuaZiLong"},"content":"1b. The user specifies multiple tags or incorrect parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"ChuaZiLong"},"content":"1b1. The application shows an error message and instructions for correct input format.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"ChuaZiLong"},"content":"**Use case: `find_and_export`**","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"ChuaZiLong"},"content":"1. User requests to search for users by a specific tag and optionally by name and/or address, and export the results.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"ChuaZiLong"},"content":"2. The application filters the users according to the given criteria and displays the filtered list.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"ChuaZiLong"},"content":"3. The application exports the filtered list to a specified file or a default file if no filename is provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"ChuaZiLong"},"content":"4. The application notifies the user that the export was successful.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"ChuaZiLong"},"content":"2a. No users match the given criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"ChuaZiLong"},"content":"2a1. The application alerts the user that no matching contacts were found.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"ChuaZiLong"},"content":"3a. The user specifies an invalid filename or multiple filenames.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"ChuaZiLong"},"content":"3a1. The application shows an error message regarding the filename issue.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ChuaZiLong"},"content":"1a. The user includes extra spaces in the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"ChuaZiLong"},"content":"1a1. The application trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"ChuaZiLong"},"content":"**Use case: `import`**","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"ChuaZiLong"},"content":"1. User requests to import contacts from one or multiple JSON files located in the ./data/ directory.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"ChuaZiLong"},"content":"2. The application validates the existence and format of the specified file(s).","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"ChuaZiLong"},"content":"3. The application imports the contacts from the file(s) into the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"ChuaZiLong"},"content":"4. The application notifies the user that the import was successful.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"ChuaZiLong"},"content":"2a. One or more specified files do not exist in the ./data/ directory.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"ChuaZiLong"},"content":"2a1. The application informs the user which files could not be found.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"ChuaZiLong"},"content":"2b. One or more files are not in the correct JSON format.","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"ChuaZiLong"},"content":"2b1. The application notifies the user which files have format issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"ChuaZiLong"},"content":"1a. The user includes extra spaces in the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"ChuaZiLong"},"content":"1a1. The application trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"ChuaZiLong"},"content":"3. Designed for users who can type fast, making command execution quicker than using a mouse.","lastModifiedDate":"2024-02-24"},{"lineNumber":430,"author":{"gitId":"ChuaZiLong"},"content":"4. Exporting and importing operations should be completed within a reasonable time frame, not exceeding 10 seconds per operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"ChuaZiLong"},"content":"5. The application must ensure the security and privacy of private contact details during import and export operations. Data should be handled in a manner that prevents unauthorized access.","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"ChuaZiLong"},"content":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2024-03-10"},{"lineNumber":435,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"ChuaZiLong"},"content":"3. Designed for users who can type fast, making command execution quicker than using a mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"wilsonwid"},"content":"4. All operations should be able to run within 500ms measured after user input has finished.","lastModifiedDate":"2024-03-10"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":443,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"ChuaZiLong"},"content":"* **Tag**: A keyword or label assigned to a contact to categorize them based on certain criteria or characteristics. Tags allow users to filter and organize contacts more efficiently.","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"ChuaZiLong"},"content":"* **Command**: A specific instruction given by the user to the application to perform a particular operation, such as searching, exporting, or importing data.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"ChuaZiLong"},"content":"* **JSON File**: A file format that uses human-readable text to store and transmit data objects consisting of attribute-value pairs. It\u0027s used for importing and exporting contact information in the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"ChuaZiLong"},"content":"* **Filter Criteria**: The conditions or parameters (such as tag, name, or address) used to search for specific contacts within the application. These criteria help in refining search results to match the user\u0027s requirements more closely.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"ChuaZiLong"},"content":"* **Export**: The process of saving data from the application to a file, which can then be used outside the application. This can be particularly useful for creating backups or for using the contact information in other software or services.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"ChuaZiLong"},"content":"* **Import**: The process of adding or updating contacts in the application by loading them from an external file, typically in a structured format like JSON. This allows users to quickly populate the application with a large number of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"ChuaZiLong"},"content":"* **Contact Manager**: The component or feature of the application that handles the storage, retrieval, organization, and modification of contact information. It is central to the application\u0027s functionality regarding managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"ChuaZiLong"},"content":"* **Data Directory**: A specific folder or location within the system where the application stores its data files, such as contact exports or imports. The ./data/ directory is an example where JSON files might be found for import operations.","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":461,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":462,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wilsonwid":6,"-":394,"ChuaZiLong":106}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"wilsonwid"},"content":"# Student Contact Manager User Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager is a student-designed app made for students who are in need of managing their daily activities.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wilsonwid"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"wilsonwid"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"wilsonwid"},"content":"Adds a person to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"wilsonwid"},"content":"Shows a list of all persons in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"wilsonwid"},"content":"Edits an existing person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"ChuaZiLong"},"content":"### Search by tag: find_by_tag","lastModifiedDate":"2024-03-07"},{"lineNumber":135,"author":{"gitId":"ChuaZiLong"},"content":"* Finds users by tag, optionally with another filter based on their other personal details.","lastModifiedDate":"2024-03-07"},{"lineNumber":136,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":137,"author":{"gitId":"ChuaZiLong"},"content":"Format: `find_by_tag TAG [n/NAME] [a/ADDRESS]`","lastModifiedDate":"2024-03-07"},{"lineNumber":138,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":139,"author":{"gitId":"ChuaZiLong"},"content":"* `TAG` needs to be a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"ChuaZiLong"},"content":"* `NAME` needs to be a substring of a person\u0027s name","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"ChuaZiLong"},"content":"* `ADDRESS` needs to be a substring of a person\u0027s address","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"ChuaZiLong"},"content":"Example commands","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag cs2103t`","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag n/zilong`","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag a/ang mo kio avenue 10 `","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":148,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"ChuaZiLong"},"content":"### Exporting a subset of data","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"ChuaZiLong"},"content":"Exports the users that are filtered by a tag and other optional parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"ChuaZiLong"},"content":"Format: `find_and_export TAG [n/NAME] [a/ADDRESS] [o/FILENAME]`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"ChuaZiLong"},"content":"* `TAG` needs to be a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"ChuaZiLong"},"content":"* `NAME` needs to be a substring of a person\u0027s name","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"ChuaZiLong"},"content":"* `ADDRESS` needs to be a substring of a person\u0027s address","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"ChuaZiLong"},"content":"* `FILENAME` needs to be a valid filename","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"ChuaZiLong"},"content":"Example commands","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"ChuaZiLong"},"content":"* `find_and_export cs2103t`","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"ChuaZiLong"},"content":"* `find_and_export cs2103t n/john a/olive street 42 o/output1`","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"ChuaZiLong"},"content":"### Importing a datafile","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"ChuaZiLong"},"content":"Imports contact details from a JSON file with filename specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"ChuaZiLong"},"content":"Format: `import FILENAME [FILENAME_2] [FILENAME_3] …`","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"ChuaZiLong"},"content":"* `FILENAME` needs to be a valid filename that is found in the `./data/` directory","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"ChuaZiLong"},"content":"Example commands","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"ChuaZiLong"},"content":"* import export","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"ChuaZiLong"},"content":"* import contacts_export","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"ChuaZiLong"},"content":"* import contacts_export1 contacts_export2","lastModifiedDate":"2024-03-07"},{"lineNumber":175,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"wilsonwid"},"content":"Deletes the specified person from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"wilsonwid"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"wilsonwid"},"content":"Clears all entries from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":209,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-07"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"wilsonwid"},"content":"If your changes to the data file makes its format invalid, Student Contact Manager will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":215,"author":{"gitId":"wilsonwid"},"content":"Furthermore, certain edits can cause Student Contact Manager to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":216,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":218,"author":{"gitId":"wilsonwid"},"content":"### Searching by a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":219,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":220,"author":{"gitId":"wilsonwid"},"content":"### Exporting data","lastModifiedDate":"2024-03-07"},{"lineNumber":221,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":222,"author":{"gitId":"wilsonwid"},"content":"### Importing data","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager allows importing of contact data from a JSON file.","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":226,"author":{"gitId":"wilsonwid"},"content":"Format: `import FILENAME1 [FILENAME2] [FILENAME3] ...`","lastModifiedDate":"2024-03-07"},{"lineNumber":227,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":228,"author":{"gitId":"wilsonwid"},"content":"Note: The imported file needs to be placed in the same directory as the main JSON save file.","lastModifiedDate":"2024-03-07"},{"lineNumber":229,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":230,"author":{"gitId":"wilsonwid"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":231,"author":{"gitId":"wilsonwid"},"content":"* `import save_file1`","lastModifiedDate":"2024-03-07"},{"lineNumber":232,"author":{"gitId":"wilsonwid"},"content":"* `import save_file1 save_file2`","lastModifiedDate":"2024-03-07"},{"lineNumber":233,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":234,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"wilsonwid"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Student Contact Manager home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":249,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":251,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":253,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":257,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wilsonwid":31,"-":189,"ChuaZiLong":43}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eStudent Contact Manager\u003c/a\u003e","lastModifiedDate":"2024-02-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W08-3/tp/tree/master\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"wilsonwid":1,"-":66}},{"path":"docs/team/wilsonwid.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wilsonwid"},"content":"# Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wilsonwid"},"content":"## Profile/Summary","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wilsonwid"},"content":"Hello there! I\u0027m Wilson, a 3rd year Computer Science and Data Science and Analytics Double Degree student at the National University of Singapore.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wilsonwid":4}},{"path":"docs/team/zilong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"# Chua Zi Long","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"ChuaZiLong"},"content":"## Profile/Summary","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"ChuaZiLong"},"content":"Current Year 2 Computer Science and Mathematics Double Degree student from the National University of Singapore.","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":6,"author":{"gitId":"ChuaZiLong"},"content":"- Email: e0957913@u.nus.edu","lastModifiedDate":"2024-02-24"},{"lineNumber":7,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":"## EDUCATION","lastModifiedDate":"2024-02-24"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":"**National University of Singapore (NUS)**","lastModifiedDate":"2024-02-24"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"*Aug 2022 - Present*","lastModifiedDate":"2024-02-24"},{"lineNumber":11,"author":{"gitId":"ChuaZiLong"},"content":"- Double Degree in Computer Science and Mathematics","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"ChuaZiLong"},"content":"- Expected Date of Graduation: July 2027","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ChuaZiLong":12}}] diff --git a/AY2324S2-CS2103T-W08-3_tp_master/commits.json b/AY2324S2-CS2103T-W08-3_tp_master/commits.json index 7f98a9f6..5c8e738b 100644 --- a/AY2324S2-CS2103T-W08-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W08-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"wilsonwid":[{"date":"2024-03-06","commitResults":[{"hash":"919ce8137e880425033368ee7c4b8e81e7e36aba","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZiLong/master","messageBody":" Update README, AboutUs and personal information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"153718103fc909e4e3a483f9eb55ee7749f12942","isMergeCommit":false,"messageTitle":"Add README changes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"4ea83ef080603f2e0712c84f3607eb7c638791ef","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"64fc99e8acc484cc86476013d4c0c27f82dd40b6","isMergeCommit":false,"messageTitle":"Add UG importing","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":15}}}]},{"date":"2024-03-10","commitResults":[{"hash":"d33bc0a74ca74305cdbefb61620c955017fd45ec","isMergeCommit":false,"messageTitle":"Add personal info to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":20}}},{"hash":"59ba78a0c2ac0550deef2f29add36a89d203141e","isMergeCommit":false,"messageTitle":"Fix formatting issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"198b689bd04775113b9d621c6a7b6495bd6fef5a","isMergeCommit":false,"messageTitle":"Update github link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8af499e926fb2097a3fc95206230a7a07cbea45b","isMergeCommit":true,"messageTitle":"Merge pull request #22 from wilsonwid/wilsonwid-readme","messageBody":"Add documentation","fileTypesAndContributionMap":{}}]}],"tahsinhasem":[],"ChuaZiLong":[{"date":"2024-03-05","commitResults":[{"hash":"a71e2038f147da2ef743ad5b8ba83799487fe183","isMergeCommit":false,"messageTitle":"Update README, AboutUs and personal information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":13}}},{"hash":"44d23f80316ec3d35ad6497856af3b2ec3a7b4d7","isMergeCommit":false,"messageTitle":"Add new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"803eefa59d4185da362df006f54c1f594c890e30","isMergeCommit":false,"messageTitle":"Change path in aboutus to my picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"sarjinius":[]},"authorFileTypeContributionMap":{"wilsonwid":{"docs":54,"functional-code":0,"test-code":0},"tahsinhasem":{"docs":0,"functional-code":0,"test-code":0},"ChuaZiLong":{"docs":16,"functional-code":0,"test-code":0},"sarjinius":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"wilsonwid":318.9481,"tahsinhasem":0.0,"ChuaZiLong":63.750847,"sarjinius":0.0},"authorDisplayNameMap":{"wilsonwid":"CS2103T-W08-3 WILS..HANA","tahsinhasem":"CS2103T-W08-3 AONI..ASEM","ChuaZiLong":"CS2103T-W08-3 CHUA..LONG","sarjinius":"CS2103T-W08-3 SARJ..BONA"}} +{"authorDailyContributionsMap":{"wilsonwid":[{"date":"2024-03-06","commitResults":[{"hash":"919ce8137e880425033368ee7c4b8e81e7e36aba","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZiLong/master","messageBody":" Update README, AboutUs and personal information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"153718103fc909e4e3a483f9eb55ee7749f12942","isMergeCommit":false,"messageTitle":"Add README changes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"4ea83ef080603f2e0712c84f3607eb7c638791ef","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"64fc99e8acc484cc86476013d4c0c27f82dd40b6","isMergeCommit":false,"messageTitle":"Add UG importing","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":15}}}]},{"date":"2024-03-10","commitResults":[{"hash":"d33bc0a74ca74305cdbefb61620c955017fd45ec","isMergeCommit":false,"messageTitle":"Add personal info to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":20}}},{"hash":"59ba78a0c2ac0550deef2f29add36a89d203141e","isMergeCommit":false,"messageTitle":"Fix formatting issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"198b689bd04775113b9d621c6a7b6495bd6fef5a","isMergeCommit":false,"messageTitle":"Update github link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8af499e926fb2097a3fc95206230a7a07cbea45b","isMergeCommit":true,"messageTitle":"Merge pull request #22 from wilsonwid/wilsonwid-readme","messageBody":"Add documentation","fileTypesAndContributionMap":{}},{"hash":"de94a88c0345e231922965a12bcf908e30b0b865","isMergeCommit":true,"messageTitle":"Merge pull request #20 from ChuaZiLong/master","messageBody":"Update the UG and DG","fileTypesAndContributionMap":{}}]}],"tahsinhasem":[],"ChuaZiLong":[{"date":"2024-02-24","commitResults":[{"hash":"892055b872ab3d2d97bec1035b8e1292c9217efe","isMergeCommit":false,"messageTitle":"Update AboutUs for Zi Long","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":5}}},{"hash":"93dcc3608304f90af44bf6046a8e256334678340","isMergeCommit":false,"messageTitle":"Update README based on the requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"781406def87aa814bfb544d6047f16fcc816790f","isMergeCommit":false,"messageTitle":"Update target user profile and NFRs in the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"71edabba66e4c1e3912b27ad34f806a6eab321fb","isMergeCommit":false,"messageTitle":"Add new lines to the end of the files to comply with standards","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":2},"test-code":{"insertions":1,"deletions":1}}},{"hash":"825c92d164f73cddc0bef90f268e6f37467767b3","isMergeCommit":false,"messageTitle":"Add a new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"601065e0dc069e4dc68c89eeaad93680025f9f00","isMergeCommit":false,"messageTitle":"Correct code standards for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":21,"deletions":20}}},{"hash":"d1a085ede0626e367ec09ecd1a9d27ae08664d8b","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":51,"deletions":9}}},{"hash":"b423ed5d621f4fde5819ccfce54a440fe36f3f82","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"c1efcc7cbf5c4ae31df51eecb380b078777c29bc","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1}}},{"hash":"0fcb6af4c7cdabfe69e3de80d1a30863c5bf67ae","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"ce8ddefcf75b69c586f005135ba4470c982db787","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":1,"deletions":1}}},{"hash":"91e913530efc4b379676abca9979da10893639be","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":2,"deletions":2}}},{"hash":"4ef99d62582852f33eb70b6ed5c7de496692c33e","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a71e2038f147da2ef743ad5b8ba83799487fe183","isMergeCommit":false,"messageTitle":"Update README, AboutUs and personal information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":13}}},{"hash":"44d23f80316ec3d35ad6497856af3b2ec3a7b4d7","isMergeCommit":false,"messageTitle":"Add new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"803eefa59d4185da362df006f54c1f594c890e30","isMergeCommit":false,"messageTitle":"Change path in aboutus to my picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"fe379b250589eeb3b82354f085c488f852b7f624","isMergeCommit":false,"messageTitle":"Update the UG and DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":183,"deletions":0}}}]},{"date":"2024-03-10","commitResults":[{"hash":"a79089205cbfc9f56310d65f7eda9ac2ff1cf1b6","isMergeCommit":true,"messageTitle":"Remove unnecessary stuff from the UG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"44e6dbc64821d6c049c306d2d00298b56d2b3ad5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1488b3e3c28b750a2492932be0c0241a783d66e9","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}},{"hash":"bcb91a22d4c26137f22021ead2bc99ee1190ea11","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/ChuaZiLong/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c0521d737736ae517abd7b071e748cf951c7b049","isMergeCommit":false,"messageTitle":"Pull to sync with local then remove unnecessary stuff from the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":12}}},{"hash":"4cd009af1dedd61a384bd97af5e649b8f3d9103f","isMergeCommit":false,"messageTitle":"Undo changes due to the week 6 code tracing exercise","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":55,"deletions":305},"test-code":{"insertions":19,"deletions":112}}},{"hash":"e4bb9aea06e9b99225e1414a727098cbefbebd84","isMergeCommit":false,"messageTitle":"Add white space at EOF","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7},"test-code":{"insertions":2,"deletions":2}}},{"hash":"f1b3c96d1110ea22694752092aacd9bc02928276","isMergeCommit":false,"messageTitle":"Add white space at EOF","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":2,"deletions":2}}},{"hash":"280e9b5529a5f654533f520fcf8d84396b636a45","isMergeCommit":false,"messageTitle":"Add whitespace at EOF","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"e2d427fa059fe85cf89056baa986787defb73606","isMergeCommit":false,"messageTitle":"Correct indentation in some files","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":37,"deletions":37}}},{"hash":"c99368484cbb65a3288532492ba178e63af92674","isMergeCommit":false,"messageTitle":"Comment out untested code to pass checkstyle temporarily","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":3}}},{"hash":"eb91e8d819ca6f4da51e610e32e9adef20cfff0f","isMergeCommit":false,"messageTitle":"Comment out import statements to temporarily pass code coverage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}},{"hash":"258cfa9b87bcc79234ea4dd340aba8e99383e8d5","isMergeCommit":false,"messageTitle":"Remove untested code to temporarily pass code coverage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":20}}},{"hash":"a2dc4db58f669d9371fa7c2c00ecbabaa5dafce5","isMergeCommit":false,"messageTitle":"Revert files to before week 6 tracing code","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":11}}},{"hash":"205f9dc554b7a5c8aca0ff69568bd65fd2edca99","isMergeCommit":false,"messageTitle":"Add whitespace to EOF for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":3}}},{"hash":"befcc5389f3fcba85e80a94ba20204b22652caab","isMergeCommit":false,"messageTitle":"Fix indentation for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":6}}},{"hash":"b5ea5cfc79c89cd6bef2cbbb0f063204f1ebc411","isMergeCommit":false,"messageTitle":"Copy files from team\u0027s remote repo","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":8}}},{"hash":"4e6e0cae9810b987306b9b0651463206e428bb00","isMergeCommit":false,"messageTitle":"Update indentation in a file to match team repo","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":18,"deletions":18}}},{"hash":"344ee87f5d2a926f909b4f57b8ed2b2dac2bf28b","isMergeCommit":false,"messageTitle":"Add whitespace at EOF for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":2}}},{"hash":"baf6aa19d3c6401e86f174244ffbbad599b2817f","isMergeCommit":false,"messageTitle":"Fix indentation in a file","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":2}}}]}],"sarjinius":[]},"authorFileTypeContributionMap":{"wilsonwid":{"docs":52,"functional-code":0,"test-code":0},"tahsinhasem":{"docs":0,"functional-code":0,"test-code":0},"ChuaZiLong":{"docs":172,"functional-code":0,"test-code":0},"sarjinius":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"wilsonwid":318.9481,"tahsinhasem":0.0,"ChuaZiLong":32382.338,"sarjinius":0.0},"authorDisplayNameMap":{"wilsonwid":"CS2103T-W08-3 WILS..HANA","tahsinhasem":"CS2103T-W08-3 AONI..ASEM","ChuaZiLong":"CS2103T-W08-3 CHUA..LONG","sarjinius":"CS2103T-W08-3 SARJ..BONA"}} diff --git a/AY2324S2-CS2103T-W09-2_tp_master/authorship.json b/AY2324S2-CS2103T-W09-2_tp_master/authorship.json index b9643f0d..19df4edc 100644 --- a/AY2324S2-CS2103T-W09-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W09-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"menatahari"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W09-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W09-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"menatahari"},"content":"# Capital Connect #","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"menatahari"},"content":"## Description ##","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"menatahari"},"content":"Capital Connect is an app that is designed to streamline the management of startup investments, enabling VC firms to easily add, categorize, and track a diverse portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"menatahari"},"content":"## Documentation ##","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"menatahari"},"content":"For the detailed documentation of this project, see the **[Capital Connect Product Website](https://ay2324s2-cs2103t-w09-2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"menatahari"},"content":"## Credits and Acknowledgements ##","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"menatahari"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"menatahari":19,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":"### Yeo Shu Heng","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"\u003cimg src\u003d\"images/yeoshuheng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"[[homepage](https://www.linkedin.com/in/yeoshuheng/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"[[github](https://github.com/yeoshuheng)]","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"[[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":"* Role: Developer","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"### Daniel Wang","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/dwangwk.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/dwangwk)]","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":"[[portfolio](team/danielwang.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":"### Ye Si Fan","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/yespiggy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/yespiggy)] [[portfolio](team/sifan.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"dwangwk"},"content":"### Natasya Hadiatullah Buhari","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/menatahari.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/menatahari)]","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"dwangwk"},"content":"[[portfolio](team/natasya.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"dwangwk"},"content":"* Responsibilities: Dev Ops","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":13,"-":32,"yeoshuheng":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"yespiggy"},"content":"# CapitalConnect Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"yespiggy"},"content":"**Target user profile**: A venture capital portfolio manager who","lastModifiedDate":"2024-03-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"yespiggy"},"content":"* has a need to keep a significant amount of startup investments","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"yespiggy"},"content":"**Value proposition**: Venture capital firms manage diverse portfolios of startup ","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"yespiggy"},"content":"investments across various industries. The app streamlines the management of startup","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"yespiggy"},"content":"investments, enabling VC firms to easily add, categorize, and track a diverse ","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"yespiggy"},"content":"portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"yespiggy"},"content":"|-----------|-------------------|-------------------------------------------------------|--------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | view the startup investments in my portfolio | see the list of startup investments that I\u0027m interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | add a new startup investment to my portfolio | save the details of the new startup investment |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | delete a startup investment to my portfolio | remove the startup investment that I am no longer interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"yespiggy"},"content":"| `* *` | user | find a startup investment by name | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | assign funding stages to startup investments | know more about the startup investment when checking it through the app |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | find a startup investment by industry \u0026 funding stage | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"yespiggy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"dwangwk"},"content":"**Use case: Add a startup investment**","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"dwangwk"},"content":"1. User requests to add a new startup investment to their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to provide details including:","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"dwangwk"},"content":" * Startup name","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"dwangwk"},"content":" * Industry","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"dwangwk"},"content":" * Funding stage","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"dwangwk"},"content":" * Address","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"dwangwk"},"content":" * Contact information","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"dwangwk"},"content":"3. User provides the necessary details.","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect adds the new startup investment to the user\u0027s portfolio in the dashboard.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"dwangwk"},"content":"* 4b. Startup name already exists in the portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"dwangwk"},"content":" * 4b1. CapitalConnect notifies the user about the duplicate entry.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"dwangwk"},"content":"**Use case: Search for startup investments by industry \u0026 funding stage**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"dwangwk"},"content":"1. User requests to search for startup investments by industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"dwangwk"},"content":"3. User provides the industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect searches for startup investments matching the specified industry and funding stage in the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays the startup investments matching the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"dwangwk"},"content":"* 6a. No startup investments match the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"dwangwk"},"content":" * 6a1. CapitalConnect shows an error message indicating no matches found.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"dwangwk"},"content":"**Use case: Search for startup investments by name**","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"dwangwk"},"content":"1. User requests to search for startup investments by name.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the name of the startup.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"dwangwk"},"content":"3. User provides the name of the startup.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect searches for startup investments matching the specified name in the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays the startup investments matching the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"dwangwk"},"content":"* 6a. No startup investments match the provided name.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"dwangwk"},"content":" * 6a1. CapitalConnect shows an error message indicating no matches found.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"dwangwk"},"content":"**Use case: Save the current state of CapitalConnect dashboard**","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"dwangwk"},"content":"1. CapitalConnect automatically saves the state of the dashboard after every add and delete operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"dwangwk"},"content":"* 1a. Issue with saving the dashboard state.","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"dwangwk"},"content":" * 1a1. CapitalConnect shows an error message indicating the issue with saving the dashboard state.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"dwangwk"},"content":"**Use case: Delete a startup investment from the portfolio**","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"dwangwk"},"content":"1. User requests to delete a specific startup investment from their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the index of the startup investment to be deleted.","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"dwangwk"},"content":"3. User provides the index of the startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect deletes the startup investment at the specified index from the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays a confirmation message indicating successful deletion of the startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"dwangwk"},"content":"* 5a. Specified index is out of range or no startup investments at the specified index.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"dwangwk"},"content":" * 5a1. CapitalConnect shows an error message indicating the issue.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"dwangwk"},"content":"2. Should be able to hold up to 1000 startups without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"dwangwk"},"content":"4. The system should have a response time of less than 1 second for common operations, such as adding or deleting a startup investment, to provide a smooth user experience.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"dwangwk"},"content":"5. The application should provide clear and user-friendly error messages in case of invalid input or system errors to assist users in troubleshooting issues efficiently.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"dwangwk"},"content":"6. The dashboard interface should be responsive and adapt to different screen sizes, ensuring a seamless user experience across devices such as desktops, laptops, tablets, and smartphones.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":455,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"dwangwk"},"content":"* **CapitalConnect dashboard**: The user interface of the CapitalConnect application where users can manage their startup investments, perform searches, and view their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"dwangwk"},"content":"* **Startup investment**: An investment made by a user in a startup company, typically including details such as the startup name, industry, funding stage, address, and contact information.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"dwangwk"},"content":"* **Industry**: The sector or field in which a startup operates, such as Tech, Biotech, or Finance.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"dwangwk"},"content":"* **Funding stage**: The development stage of a startup at which it has received a certain level of investment, such as Seed, Series A, or Series B.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"dwangwk"},"content":"* **Dashboard state**: The current configuration and data displayed in the CapitalConnect dashboard, including startup investments and any applied filters or search results.","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"dwangwk"},"content":"* **Index**: A numeric value representing the position of an item within a list, used in commands to reference specific startup investments in the portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"dwangwk"},"content":"* **Confirmation message**: A notification displayed to the user indicating the successful completion of an action, such as adding or deleting a startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":472,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":473,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"dwangwk":126,"yespiggy":15,"-":376}},{"path":"docs/team/danielwang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Daniel Wang\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":42}},{"path":"docs/team/natasya.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Natasya\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":42}},{"path":"docs/team/shuheng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":"* **New Feature**: Added the ability to add startups to the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" * What it does: This allows users to add startups to Capital Connect alongside information such as funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" * Justification: This is imperative for our users as they consist of key information they have to track.","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":41,"yeoshuheng":3}},{"path":"docs/team/sifan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Si Fan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":41}},{"path":"src/main/java/seedu/address/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2023-07-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.Prefix;","lastModifiedDate":"2023-07-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Industry: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getIndustry())","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Funding Stage: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getFundingStage())","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":51,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_INDUSTRY + \"INDUSTRY \"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE \"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":84,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-12-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_INDUSTRY + \"INDUSTRY\" + \"] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":93,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" FundingStage updatedFundingStage \u003d editPersonDescriptor.getFundingStage().orElse(","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" personToEdit.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" Industry updatedIndustry \u003d editPersonDescriptor.getIndustry().orElse(personToEdit.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" return new Person(updatedName, updatedFundingStage, updatedIndustry,","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":144,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":153,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":154,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":155,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":162,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":163,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" setFundingStage(toCopy.fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" setIndustry(toCopy.industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":168,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":169,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" return CollectionUtil.isAnyNonNull(name, industry, fundingStage, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":179,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":180,"author":{"gitId":"yeoshuheng"},"content":" public void setIndustry(Industry industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" public void setFundingStage(FundingStage fundingStage) {","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":189,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":192,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cIndustry\u003e getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cFundingStage\u003e getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":205,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":208,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":209,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":212,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":213,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":216,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":217,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":220,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":221,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":222,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":225,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":226,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":228,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":231,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":232,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":233,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":234,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":236,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":239,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":240,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":241,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":242,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":243,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":246,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":247,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":249,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":251,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":252,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":253,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":256,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":257,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":258,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":259,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(fundingStage, otherEditPersonDescriptor.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":260,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(industry, otherEditPersonDescriptor.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":261,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":262,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":263,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"-":240,"yeoshuheng":39}},{"path":"src/main/java/seedu/address/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_INDUSTRY, PREFIX_FUNDING_STAGE, PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_INDUSTRY,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_ADDRESS,","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_INDUSTRY);","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d ParserUtil.parseFundingStage(argMultimap.getValue(PREFIX_FUNDING_STAGE).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d ParserUtil.parseIndustry(argMultimap.getValue(PREFIX_INDUSTRY).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" Person person \u003d new Person(name, fundingStage, industry, phone, email, address, tagList);","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"-":57,"yeoshuheng":15}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_INDUSTRY \u003d new Prefix(\"i/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_FUNDING_STAGE \u003d new Prefix(\"f/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":15,"yeoshuheng":2}},{"path":"src/main/java/seedu/address/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_INDUSTRY, CliSyntax.PREFIX_FUNDING_STAGE, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(CliSyntax.PREFIX_NAME, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS);","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_NAME).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(CliSyntax.PREFIX_NAME).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setFundingStage(","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseFundingStage(argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setIndustry(","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseIndustry(argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setPhone(","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parsePhone(argMultimap.getValue(CliSyntax.PREFIX_PHONE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(CliSyntax.PREFIX_EMAIL).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" parseTagsForEdit(argMultimap.getAllValues(CliSyntax.PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":69,"yeoshuheng":24}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String industry} into a {@code Industry}.","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code industry} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" public static Industry parseIndustry(String industry) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" String trimmedIndustry \u003d industry.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(trimmedIndustry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return new Industry(trimmedIndustry);","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String fundingLevel} into a {@code FundingStage}.","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code fundingStage} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" public static FundingStage parseFundingStage(String fundingLevel) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" String trimmedFundingLevel \u003d fundingLevel.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingLevel)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"yeoshuheng"},"content":" return new FundingStage(trimmedFundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":109,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":116,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":121,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":123,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":125,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":134,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":138,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":149,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":150,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":152,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":157,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":124,"yeoshuheng":33}},{"path":"src/main/java/seedu/address/model/person/FundingStage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents funding stage of current project.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStage {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Funding stages should be either \u0027A\u0027, \u0027B\u0027 or \u0027C\u0027.\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for a funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" * @param fundingLevel The funding level (A, B, C) of the current stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" fundingLevel \u003d fundingLevel.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidFundingLevel(fundingLevel), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" value \u003d fundingLevel;","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidFundingLevel(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" return fundingLevel.equals(\"A\") || fundingLevel.equals(\"B\") || fundingLevel.equals(\"C\");","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof FundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" FundingStage otherFundingStage \u003d (FundingStage) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherFundingStage.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/main/java/seedu/address/model/person/Industry.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents industry person is from.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class Industry {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Industry names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" /*","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for an industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" * @param industry Name of the industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public Industry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidIndustry(industry), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" value \u003d industry.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidIndustry(String test) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof Industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" Industry otherIndustry \u003d (Industry) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherIndustry.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":58}},{"path":"src/main/java/seedu/address/model/person/Person.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" private final FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" private final Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public Person(Name name, FundingStage fundingStage, Industry industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" requireAllNonNull(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" return this.fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public Industry getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" return this.industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 industry.equals(otherPerson.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 fundingStage.equals(otherPerson.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":115,"yeoshuheng":22}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-14"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Alex Yeoh\"), new FundingStage(\"A\"), new Industry(\"Finance\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Bernice Yu\"), new FundingStage(\"B\"), new Industry(\"GreenTech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new FundingStage(\"C\"), new Industry(\"Health\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"David Li\"), new FundingStage(\"A\"), new Industry(\"Manufacturing\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new FundingStage(\"C\"), new Industry(\"Tech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new FundingStage(\"A\"), new Industry(\"Food\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"-":54,"yeoshuheng":14}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" private final String industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private final String fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"industry\") String industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" @JsonProperty(\"fundingStage\") String fundingStage, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2023-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d source.getIndustry().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d source.getFundingStage().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"yeoshuheng"},"content":" if (industry \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Industry.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"yeoshuheng"},"content":" final Industry modelIndustry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" if (fundingStage \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" FundingStage.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" final FundingStage modelFundingStage \u003d new FundingStage(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" return new Person(modelName, modelFundingStage, modelIndustry, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":139,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":107,"yeoshuheng":32}},{"path":"src/test/java/seedu/address/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2016-09-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-06-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":94,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":141,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":142,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":159,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + CommandTestUtil.FUNDING_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":173,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":169,"yeoshuheng":4}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.parser.CliSyntax;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_BOB \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_AMY \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_BOB \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_AMY \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_NAME_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_TAG_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_INDUSTRY_DESC \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_FUNDING_DESC \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + \"D\";","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" .withTags(VALID_TAG_FRIEND).withIndustry(VALID_INDUSTRY_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_BOB).withIndustry(VALID_INDUSTRY_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":109,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":118,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":134,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":143,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":107,"yeoshuheng":41}},{"path":"src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getName().orElse(null) + \", industry\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getIndustry().orElse(null) + \", funding stage\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getFundingStage().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":70,"yeoshuheng":3}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-06-15"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2017-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.PREAMBLE_WHITESPACE","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND, CommandTestUtil.VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2023-07-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" String validExpectedPersonString \u003d CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" // multiple funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.FUNDING_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" // multiple industry","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INDUSTRY_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" validExpectedPersonString + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_INDUSTRY_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_FUNDING_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_NAME_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_EMAIL_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_PHONE_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":132,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_INDUSTRY_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":137,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":138,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":139,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_FUNDING_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":173,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":180,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":187,"author":{"gitId":"yeoshuheng"},"content":" // missing industry prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":188,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":193,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":194,"author":{"gitId":"yeoshuheng"},"content":" // missing funding stage prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":195,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":206,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":209,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":210,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":211,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":212,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":219,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":220,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":221,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":225,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":227,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":228,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":230,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":232,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":233,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":235,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":236,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":237,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":238,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":239,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":240,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":241,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":243,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":244,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":246,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INVALID_FUNDING_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":247,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":249,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":251,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":254,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":255,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INVALID_INDUSTRY_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":256,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":257,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":258,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":260,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":261,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":262,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":263,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":264,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":265,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":266,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":268,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":269,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":276,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PREAMBLE_NON_EMPTY","lastModifiedDate":"2024-02-25"},{"lineNumber":277,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":278,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":279,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":280,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":281,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":283,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":117,"yeoshuheng":166}},{"path":"src/test/java/seedu/address/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-05-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-05-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"-5\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"0\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1 x/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2024-03-05"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":82,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_AMY + CommandTestUtil.VALID_PHONE_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).withAddress(CommandTestUtil.VALID_ADDRESS_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND, CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-05"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_NAME_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":139,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_PHONE_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":143,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":155,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(","lastModifiedDate":"2024-03-05"},{"lineNumber":156,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_ADDRESS_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":157,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":158,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":159,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" // industry","lastModifiedDate":"2024-03-05"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INDUSTRY_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withIndustry(","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_INDUSTRY_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":164,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" // funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.FUNDING_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withFundingStage(","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(","lastModifiedDate":"2024-03-05"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":182,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":183,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":187,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased()","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":193,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":199,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":206,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":207,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":210,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":211,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":213,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":219,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":220,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":221,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":223,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":225,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":229,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":232,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":233,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"-":147,"yeoshuheng":86}},{"path":"src/test/java/seedu/address/model/person/FundingStageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStageTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new FundingStage(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidFundingStage_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidPhone \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new FundingStage(invalidPhone));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidFundingStage() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" // null funding","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e FundingStage.isValidFundingLevel(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"AB\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"1\")); // numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"D\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" // valid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"A\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"B\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"C\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d new FundingStage(\"A\");","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(new FundingStage(\"A\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(fundingStage));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(new FundingStage(\"B\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":59}},{"path":"src/test/java/seedu/address/model/person/IndustryTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class IndustryTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Industry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidIndustry_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidName \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Industry(invalidName));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidIndustry() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e Industry.isValidIndustry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"finance*\")); // contains non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"Finance\")); // alphabets only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"MANUFACTURING\")); // all capital","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"web 3\")); // with numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d new Industry(\"Valid Industry\");","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(new Industry(\"Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(industry));","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(new Industry(\"Other Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2018-04-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2020-12-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2020-12-18"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedBob \u003d new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2020-12-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editedBob \u003d new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2018-04-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName()","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + \", industry\u003d\" + ALICE.getIndustry() + \", funding stage\u003d\" + ALICE.getFundingStage()","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", address\u003d\" + ALICE.getAddress() + \", tags\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" + ALICE.getTags() + \"}\";","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"-":97,"yeoshuheng":5}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_FUNDING \u003d \"D\";","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_INDUSTRY \u003d \" \";","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_FUNDING \u003d BENSON.getFundingStage().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_INDUSTRY \u003d BENSON.getIndustry().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":101,"yeoshuheng":26}},{"path":"src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-12-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(person.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(person.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code FundingStage} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(new FundingStage(fundingLevel));","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code Industry} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(new Industry(industry));","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":74,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":87,"yeoshuheng":20}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_INDUSTRY \u003d \"finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_FUNDING \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d new Industry(DEFAULT_INDUSTRY);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d new FundingStage(DEFAULT_FUNDING);","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d personToCopy.getIndustry();","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d personToCopy.getFundingStage();","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":63,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":99,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code fundingStage} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d new FundingStage(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code industry} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" return new Person(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"-":95,"yeoshuheng":33}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2018-03-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-03-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE + person.getFundingStage().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_INDUSTRY + person.getIndustry().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getIndustry().ifPresent(industry -\u003e sb.append(PREFIX_INDUSTRY).append(industry.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getFundingStage().ifPresent(fundingStage -\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE).append(fundingStage.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"-":62,"yeoshuheng":7}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(\"94351253\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"heinz@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"wall street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"cornelia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"werner@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"michegan ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"lydia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little tokyo\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"anna@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"4th street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"stefan@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little india\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"hans@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"chicago ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2017-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"-":67,"yeoshuheng":16}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"menatahari"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W09-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W09-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"menatahari"},"content":"# Capital Connect #","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"menatahari"},"content":"## Description ##","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"menatahari"},"content":"Capital Connect is an app that is designed to streamline the management of startup investments, enabling VC firms to easily add, categorize, and track a diverse portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"menatahari"},"content":"## Documentation ##","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"menatahari"},"content":"For the detailed documentation of this project, see the **[Capital Connect Product Website](https://ay2324s2-cs2103t-w09-2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"menatahari"},"content":"## Credits and Acknowledgements ##","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"menatahari"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"menatahari":19,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":"### Yeo Shu Heng","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"\u003cimg src\u003d\"images/yeoshuheng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"[[homepage](https://www.linkedin.com/in/yeoshuheng/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"[[github](https://github.com/yeoshuheng)]","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"[[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":"* Role: Developer","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"### Daniel Wang","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/dwangwk.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/dwangwk)]","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":"[[portfolio](team/danielwang.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":"### Ye Si Fan","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/yespiggy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/yespiggy)] [[portfolio](team/sifan.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"dwangwk"},"content":"### Natasya Hadiatullah Buhari","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/menatahari.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/menatahari)]","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"dwangwk"},"content":"[[portfolio](team/natasya.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"dwangwk"},"content":"* Responsibilities: Dev Ops","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":13,"-":32,"yeoshuheng":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"yespiggy"},"content":"# CapitalConnect Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"yespiggy"},"content":"**Target user profile**: A venture capital portfolio manager who","lastModifiedDate":"2024-03-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"yespiggy"},"content":"* has a need to keep a significant amount of startup investments","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"yespiggy"},"content":"**Value proposition**: Venture capital firms manage diverse portfolios of startup ","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"yespiggy"},"content":"investments across various industries. The app streamlines the management of startup","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"yespiggy"},"content":"investments, enabling VC firms to easily add, categorize, and track a diverse ","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"yespiggy"},"content":"portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"yespiggy"},"content":"|-----------|-------------------|-------------------------------------------------------|--------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | view the startup investments in my portfolio | see the list of startup investments that I\u0027m interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | add a new startup investment to my portfolio | save the details of the new startup investment |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | delete a startup investment to my portfolio | remove the startup investment that I am no longer interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"yespiggy"},"content":"| `* *` | user | find a startup investment by name | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | assign funding stages to startup investments | know more about the startup investment when checking it through the app |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | find a startup investment by industry \u0026 funding stage | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"yespiggy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"dwangwk"},"content":"**Use case: Add a startup investment**","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"dwangwk"},"content":"1. User requests to add a new startup investment to their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to provide details including:","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"dwangwk"},"content":" * Startup name","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"dwangwk"},"content":" * Industry","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"dwangwk"},"content":" * Funding stage","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"dwangwk"},"content":" * Address","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"dwangwk"},"content":" * Contact information","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"dwangwk"},"content":"3. User provides the necessary details.","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect adds the new startup investment to the user\u0027s portfolio in the dashboard.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"dwangwk"},"content":"* 4b. Startup name already exists in the portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"dwangwk"},"content":" * 4b1. CapitalConnect notifies the user about the duplicate entry.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"dwangwk"},"content":"**Use case: Search for startup investments by industry \u0026 funding stage**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"dwangwk"},"content":"1. User requests to search for startup investments by industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"dwangwk"},"content":"3. User provides the industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect searches for startup investments matching the specified industry and funding stage in the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays the startup investments matching the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"dwangwk"},"content":"* 6a. No startup investments match the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"dwangwk"},"content":" * 6a1. CapitalConnect shows an error message indicating no matches found.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"dwangwk"},"content":"**Use case: Search for startup investments by name**","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"dwangwk"},"content":"1. User requests to search for startup investments by name.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the name of the startup.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"dwangwk"},"content":"3. User provides the name of the startup.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect searches for startup investments matching the specified name in the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays the startup investments matching the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"dwangwk"},"content":"* 6a. No startup investments match the provided name.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"dwangwk"},"content":" * 6a1. CapitalConnect shows an error message indicating no matches found.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"dwangwk"},"content":"**Use case: Save the current state of CapitalConnect dashboard**","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"dwangwk"},"content":"1. CapitalConnect automatically saves the state of the dashboard after every add and delete operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"dwangwk"},"content":"* 1a. Issue with saving the dashboard state.","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"dwangwk"},"content":" * 1a1. CapitalConnect shows an error message indicating the issue with saving the dashboard state.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"dwangwk"},"content":"**Use case: Delete a startup investment from the portfolio**","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"dwangwk"},"content":"1. User requests to delete a specific startup investment from their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the index of the startup investment to be deleted.","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"dwangwk"},"content":"3. User provides the index of the startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect deletes the startup investment at the specified index from the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays a confirmation message indicating successful deletion of the startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"dwangwk"},"content":"* 5a. Specified index is out of range or no startup investments at the specified index.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"dwangwk"},"content":" * 5a1. CapitalConnect shows an error message indicating the issue.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"dwangwk"},"content":"2. Should be able to hold up to 1000 startups without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"dwangwk"},"content":"4. The system should have a response time of less than 1 second for common operations, such as adding or deleting a startup investment, to provide a smooth user experience.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"dwangwk"},"content":"5. The application should provide clear and user-friendly error messages in case of invalid input or system errors to assist users in troubleshooting issues efficiently.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"dwangwk"},"content":"6. The dashboard interface should be responsive and adapt to different screen sizes, ensuring a seamless user experience across devices such as desktops, laptops, tablets, and smartphones.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":455,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"dwangwk"},"content":"* **CapitalConnect dashboard**: The user interface of the CapitalConnect application where users can manage their startup investments, perform searches, and view their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"dwangwk"},"content":"* **Startup investment**: An investment made by a user in a startup company, typically including details such as the startup name, industry, funding stage, address, and contact information.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"dwangwk"},"content":"* **Industry**: The sector or field in which a startup operates, such as Tech, Biotech, or Finance.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"dwangwk"},"content":"* **Funding stage**: The development stage of a startup at which it has received a certain level of investment, such as Seed, Series A, or Series B.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"dwangwk"},"content":"* **Dashboard state**: The current configuration and data displayed in the CapitalConnect dashboard, including startup investments and any applied filters or search results.","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"dwangwk"},"content":"* **Index**: A numeric value representing the position of an item within a list, used in commands to reference specific startup investments in the portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"dwangwk"},"content":"* **Confirmation message**: A notification displayed to the user indicating the successful completion of an action, such as adding or deleting a startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":472,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":473,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"dwangwk":126,"yespiggy":15,"-":376}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"yespiggy"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eCapitalConnect\u003c/a\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"yespiggy"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W09-2/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"yespiggy":2,"-":65}},{"path":"docs/team/danielwang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Daniel Wang\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":42}},{"path":"docs/team/natasya.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Natasya\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":42}},{"path":"docs/team/shuheng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":"* **New Feature**: Added the ability to add startups to the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" * What it does: This allows users to add startups to Capital Connect alongside information such as funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" * Justification: This is imperative for our users as they consist of key information they have to track.","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":41,"yeoshuheng":3}},{"path":"docs/team/sifan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Si Fan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":41}},{"path":"src/main/java/seedu/address/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2023-07-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.Prefix;","lastModifiedDate":"2023-07-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Industry: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getIndustry())","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Funding Stage: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getFundingStage())","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":51,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_INDUSTRY + \"INDUSTRY \"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE \"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":84,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-12-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_INDUSTRY + \"INDUSTRY\" + \"] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":93,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" FundingStage updatedFundingStage \u003d editPersonDescriptor.getFundingStage().orElse(","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" personToEdit.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" Industry updatedIndustry \u003d editPersonDescriptor.getIndustry().orElse(personToEdit.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" return new Person(updatedName, updatedFundingStage, updatedIndustry,","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":144,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":153,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":154,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":155,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":162,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":163,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" setFundingStage(toCopy.fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" setIndustry(toCopy.industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":168,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":169,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" return CollectionUtil.isAnyNonNull(name, industry, fundingStage, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":179,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":180,"author":{"gitId":"yeoshuheng"},"content":" public void setIndustry(Industry industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" public void setFundingStage(FundingStage fundingStage) {","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":189,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":192,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cIndustry\u003e getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cFundingStage\u003e getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":205,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":208,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":209,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":212,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":213,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":216,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":217,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":220,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":221,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":222,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":225,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":226,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":228,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":231,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":232,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":233,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":234,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":236,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":239,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":240,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":241,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":242,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":243,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":246,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":247,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":249,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":251,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":252,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":253,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":256,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":257,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":258,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":259,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(fundingStage, otherEditPersonDescriptor.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":260,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(industry, otherEditPersonDescriptor.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":261,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":262,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":263,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"-":240,"yeoshuheng":39}},{"path":"src/main/java/seedu/address/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_INDUSTRY, PREFIX_FUNDING_STAGE, PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_INDUSTRY,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_ADDRESS,","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_INDUSTRY);","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d ParserUtil.parseFundingStage(argMultimap.getValue(PREFIX_FUNDING_STAGE).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d ParserUtil.parseIndustry(argMultimap.getValue(PREFIX_INDUSTRY).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" Person person \u003d new Person(name, fundingStage, industry, phone, email, address, tagList);","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"-":57,"yeoshuheng":15}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_INDUSTRY \u003d new Prefix(\"i/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_FUNDING_STAGE \u003d new Prefix(\"f/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":15,"yeoshuheng":2}},{"path":"src/main/java/seedu/address/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_INDUSTRY, CliSyntax.PREFIX_FUNDING_STAGE, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(CliSyntax.PREFIX_NAME, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS);","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_NAME).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(CliSyntax.PREFIX_NAME).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setFundingStage(","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseFundingStage(argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setIndustry(","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseIndustry(argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setPhone(","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parsePhone(argMultimap.getValue(CliSyntax.PREFIX_PHONE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(CliSyntax.PREFIX_EMAIL).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" parseTagsForEdit(argMultimap.getAllValues(CliSyntax.PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":69,"yeoshuheng":24}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String industry} into a {@code Industry}.","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code industry} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" public static Industry parseIndustry(String industry) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" String trimmedIndustry \u003d industry.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(trimmedIndustry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return new Industry(trimmedIndustry);","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String fundingLevel} into a {@code FundingStage}.","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code fundingStage} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" public static FundingStage parseFundingStage(String fundingLevel) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" String trimmedFundingLevel \u003d fundingLevel.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingLevel)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"yeoshuheng"},"content":" return new FundingStage(trimmedFundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":109,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":116,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":121,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":123,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":125,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":134,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":138,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":149,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":150,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":152,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":157,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":124,"yeoshuheng":33}},{"path":"src/main/java/seedu/address/model/person/FundingStage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents funding stage of current project.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStage {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Funding stages should be either \u0027A\u0027, \u0027B\u0027 or \u0027C\u0027.\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for a funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" * @param fundingLevel The funding level (A, B, C) of the current stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" fundingLevel \u003d fundingLevel.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidFundingLevel(fundingLevel), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" value \u003d fundingLevel;","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidFundingLevel(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" return fundingLevel.equals(\"A\") || fundingLevel.equals(\"B\") || fundingLevel.equals(\"C\");","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof FundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" FundingStage otherFundingStage \u003d (FundingStage) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherFundingStage.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/main/java/seedu/address/model/person/Industry.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents industry person is from.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class Industry {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Industry names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" /*","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for an industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" * @param industry Name of the industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public Industry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidIndustry(industry), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" value \u003d industry.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidIndustry(String test) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof Industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" Industry otherIndustry \u003d (Industry) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherIndustry.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":58}},{"path":"src/main/java/seedu/address/model/person/Person.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" private final FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" private final Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public Person(Name name, FundingStage fundingStage, Industry industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" requireAllNonNull(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" return this.fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public Industry getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" return this.industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 industry.equals(otherPerson.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 fundingStage.equals(otherPerson.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":115,"yeoshuheng":22}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-14"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Alex Yeoh\"), new FundingStage(\"A\"), new Industry(\"Finance\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Bernice Yu\"), new FundingStage(\"B\"), new Industry(\"GreenTech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new FundingStage(\"C\"), new Industry(\"Health\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"David Li\"), new FundingStage(\"A\"), new Industry(\"Manufacturing\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new FundingStage(\"C\"), new Industry(\"Tech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new FundingStage(\"A\"), new Industry(\"Food\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"-":54,"yeoshuheng":14}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" private final String industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private final String fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"industry\") String industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" @JsonProperty(\"fundingStage\") String fundingStage, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2023-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d source.getIndustry().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d source.getFundingStage().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"yeoshuheng"},"content":" if (industry \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Industry.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"yeoshuheng"},"content":" final Industry modelIndustry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" if (fundingStage \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" FundingStage.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" final FundingStage modelFundingStage \u003d new FundingStage(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" return new Person(modelName, modelFundingStage, modelIndustry, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":139,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":107,"yeoshuheng":32}},{"path":"src/test/java/seedu/address/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2016-09-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-06-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":94,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":141,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":142,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":159,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + CommandTestUtil.FUNDING_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":173,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":169,"yeoshuheng":4}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.parser.CliSyntax;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_BOB \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_AMY \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_BOB \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_AMY \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_NAME_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_TAG_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_INDUSTRY_DESC \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_FUNDING_DESC \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + \"D\";","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" .withTags(VALID_TAG_FRIEND).withIndustry(VALID_INDUSTRY_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_BOB).withIndustry(VALID_INDUSTRY_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":109,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":118,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":134,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":143,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":107,"yeoshuheng":41}},{"path":"src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getName().orElse(null) + \", industry\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getIndustry().orElse(null) + \", funding stage\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getFundingStage().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":70,"yeoshuheng":3}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-06-15"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2017-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.PREAMBLE_WHITESPACE","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND, CommandTestUtil.VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2023-07-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" String validExpectedPersonString \u003d CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" // multiple funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.FUNDING_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" // multiple industry","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INDUSTRY_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" validExpectedPersonString + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_INDUSTRY_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_FUNDING_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_NAME_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_EMAIL_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_PHONE_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":132,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_INDUSTRY_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":137,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":138,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":139,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_FUNDING_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":173,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":180,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":187,"author":{"gitId":"yeoshuheng"},"content":" // missing industry prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":188,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":193,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":194,"author":{"gitId":"yeoshuheng"},"content":" // missing funding stage prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":195,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":206,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":209,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":210,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":211,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":212,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":219,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":220,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":221,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":225,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":227,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":228,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":230,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":232,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":233,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":235,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":236,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":237,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":238,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":239,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":240,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":241,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":243,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":244,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":246,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INVALID_FUNDING_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":247,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":249,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":251,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":254,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":255,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INVALID_INDUSTRY_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":256,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":257,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":258,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":260,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":261,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":262,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":263,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":264,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":265,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":266,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":268,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":269,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":276,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PREAMBLE_NON_EMPTY","lastModifiedDate":"2024-02-25"},{"lineNumber":277,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":278,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":279,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":280,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":281,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":283,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":117,"yeoshuheng":166}},{"path":"src/test/java/seedu/address/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-05-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-05-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"-5\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"0\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1 x/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2024-03-05"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":82,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_AMY + CommandTestUtil.VALID_PHONE_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).withAddress(CommandTestUtil.VALID_ADDRESS_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND, CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-05"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_NAME_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":139,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_PHONE_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":143,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":155,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(","lastModifiedDate":"2024-03-05"},{"lineNumber":156,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_ADDRESS_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":157,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":158,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":159,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" // industry","lastModifiedDate":"2024-03-05"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INDUSTRY_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withIndustry(","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_INDUSTRY_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":164,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" // funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.FUNDING_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withFundingStage(","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(","lastModifiedDate":"2024-03-05"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":182,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":183,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":187,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased()","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":193,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":199,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":206,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":207,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":210,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":211,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":213,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":219,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":220,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":221,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":223,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":225,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":229,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":232,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":233,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"-":147,"yeoshuheng":86}},{"path":"src/test/java/seedu/address/model/person/FundingStageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStageTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new FundingStage(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidFundingStage_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidPhone \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new FundingStage(invalidPhone));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidFundingStage() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" // null funding","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e FundingStage.isValidFundingLevel(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"AB\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"1\")); // numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"D\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" // valid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"A\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"B\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"C\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d new FundingStage(\"A\");","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(new FundingStage(\"A\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(fundingStage));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(new FundingStage(\"B\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":59}},{"path":"src/test/java/seedu/address/model/person/IndustryTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class IndustryTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Industry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidIndustry_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidName \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Industry(invalidName));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidIndustry() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e Industry.isValidIndustry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"finance*\")); // contains non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"Finance\")); // alphabets only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"MANUFACTURING\")); // all capital","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"web 3\")); // with numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d new Industry(\"Valid Industry\");","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(new Industry(\"Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(industry));","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(new Industry(\"Other Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2018-04-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2020-12-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2020-12-18"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedBob \u003d new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2020-12-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editedBob \u003d new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2018-04-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName()","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + \", industry\u003d\" + ALICE.getIndustry() + \", funding stage\u003d\" + ALICE.getFundingStage()","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", address\u003d\" + ALICE.getAddress() + \", tags\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" + ALICE.getTags() + \"}\";","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"-":97,"yeoshuheng":5}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_FUNDING \u003d \"D\";","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_INDUSTRY \u003d \" \";","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_FUNDING \u003d BENSON.getFundingStage().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_INDUSTRY \u003d BENSON.getIndustry().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":101,"yeoshuheng":26}},{"path":"src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-12-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(person.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(person.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code FundingStage} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(new FundingStage(fundingLevel));","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code Industry} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(new Industry(industry));","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":74,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":87,"yeoshuheng":20}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_INDUSTRY \u003d \"finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_FUNDING \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d new Industry(DEFAULT_INDUSTRY);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d new FundingStage(DEFAULT_FUNDING);","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d personToCopy.getIndustry();","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d personToCopy.getFundingStage();","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":63,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":99,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code fundingStage} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d new FundingStage(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code industry} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" return new Person(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"-":95,"yeoshuheng":33}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2018-03-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-03-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE + person.getFundingStage().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_INDUSTRY + person.getIndustry().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getIndustry().ifPresent(industry -\u003e sb.append(PREFIX_INDUSTRY).append(industry.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getFundingStage().ifPresent(fundingStage -\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE).append(fundingStage.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"-":62,"yeoshuheng":7}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(\"94351253\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"heinz@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"wall street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"cornelia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"werner@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"michegan ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"lydia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little tokyo\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"anna@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"4th street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"stefan@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little india\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"hans@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"chicago ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2017-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"-":67,"yeoshuheng":16}}] diff --git a/AY2324S2-CS2103T-W09-2_tp_master/commits.json b/AY2324S2-CS2103T-W09-2_tp_master/commits.json index c2eeede7..44d5db5b 100644 --- a/AY2324S2-CS2103T-W09-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-W09-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"dwangwk":[{"date":"2024-03-07","commitResults":[{"hash":"1499dc1041a33dd81b79a49768feaa09e6621c28","isMergeCommit":false,"messageTitle":"Docs: Update Profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":48,"deletions":6}}},{"hash":"6f6620f8977c5667616382a2af02c2584d143ef0","isMergeCommit":false,"messageTitle":"Docs: Updated Readme, DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":230,"deletions":39}}},{"hash":"56d9b344a27da1a1ec908a06899ced743f39dea4","isMergeCommit":false,"messageTitle":"Docs: About Us Sifan Image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b76da9e9d536129352e67dec71a3206d94080289","isMergeCommit":true,"messageTitle":"Merge pull request #17 from dwangwk/master","messageBody":"Update AboutUs, Readme, DeveloperGuide","fileTypesAndContributionMap":{}},{"hash":"0844d885ce4b55a007c5404578cab6ca1434f513","isMergeCommit":false,"messageTitle":"Docs: Updated Photo Name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}],"menatahari":[{"date":"2024-03-07","commitResults":[{"hash":"a8eb93c0cd4a775db4eede5a6f03de2aed2148ad","isMergeCommit":false,"messageTitle":"Update readme and uploaded photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":11}}},{"hash":"2ab29ded407cf63b39c4cfea3ca859652647986d","isMergeCommit":true,"messageTitle":"Merge pull request #15 from menatahari/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"yespiggy":[{"date":"2024-03-07","commitResults":[{"hash":"84063188a916022bf2f1b80803f0b8d8b3b2dafc","isMergeCommit":false,"messageTitle":"docs: Update DG User stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":13}}},{"hash":"fa249d62a450e496f8bf4fa2a07b6ef4cd6ffadd","isMergeCommit":true,"messageTitle":"Merge branch update DG user stories","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"676d51e0b69796e8a04234d2c15b914329cd0c96","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yespiggy/master","messageBody":"Update user stories in DG","fileTypesAndContributionMap":{}}]}],"yeoshuheng":[{"date":"2024-02-25","commitResults":[{"hash":"842594880efd9ef12b06dd5f5716ce9d1c46de79","isMergeCommit":false,"messageTitle":"docs: Update profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":15}}},{"hash":"c0b6212b3fdc7805ddddcc7a791160c2730d1219","isMergeCommit":false,"messageTitle":"feat: Add Industry and FundingStage options","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":108,"deletions":5}}},{"hash":"9d4aa185e921f647f7079e1ec5eca32e36a298fa","isMergeCommit":false,"messageTitle":"feat: Add logic for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":43,"deletions":17}}},{"hash":"ccc8a41ac1e34edbcc7189e0198a3ba61210178e","isMergeCommit":false,"messageTitle":"feat: Add sample for person with industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":35,"deletions":13}}},{"hash":"078b9e51de07a37bc01af8b33991d63b78c98578","isMergeCommit":false,"messageTitle":"feat: Update storage for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":7}}},{"hash":"9ded1fc99b36c25649aa251c7c64d68005bc3d5a","isMergeCommit":false,"messageTitle":"test: Fix test for industry, funding","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":81,"deletions":26}}},{"hash":"38212e7a41db0be57ac52c5dc78795a5ffb6a434","isMergeCommit":false,"messageTitle":"feat: Add funding, industry for edit command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":36,"deletions":12}}},{"hash":"eb7c924496e743e877b752b944d33651d1978638","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for test","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":23,"deletions":5}}},{"hash":"1ede8657f049bee88e8b82f71417b1a8c8c2b6e4","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for main","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":73,"deletions":15}}},{"hash":"d178843dbf22a382046ba7a4beb1cb3437ae9814","isMergeCommit":false,"messageTitle":"test: Update test for funding, industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":176,"deletions":113}}},{"hash":"b2b9eb02bac1c24cc39fb2b8efc575a549532253","isMergeCommit":false,"messageTitle":"style: Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":17}}}]},{"date":"2024-03-05","commitResults":[{"hash":"fb1bdef18772248a883d4eb0421a4c45a370c70a","isMergeCommit":false,"messageTitle":"fix: Add duplicate prefix checks","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1},"test-code":{"insertions":120,"deletions":0}}},{"hash":"aec40a6d3b801a6ddd30ac670bf513461480bd2e","isMergeCommit":false,"messageTitle":"test: Add test for funding stage \u0026 industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":205,"deletions":131}}},{"hash":"b773e6b431bdc5d09ffce4a4356131af78ddb243","isMergeCommit":true,"messageTitle":"Merge pull request #1 from yeoshuheng/branch-AddStartup","messageBody":"Branch add startup","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"728b2c0b2837cc516dc425fbc49fee8fd092bcc8","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yeoshuheng/master","messageBody":"v1.1: Add startup \u0026 Assign Funding Stage","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"3d2e99f939f367257f2c910af59461e14544db3b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"6109993c1f7e29ed64a217e769a86d5cd1f9fecd","isMergeCommit":true,"messageTitle":"Merge pull request #18 from dwangwk/master","messageBody":"Docs: Updated Photo Name","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dwangwk":{"docs":264,"functional-code":0,"test-code":0},"menatahari":{"docs":19,"functional-code":0,"test-code":0},"yespiggy":{"docs":15,"functional-code":0,"test-code":0},"yeoshuheng":{"docs":9,"functional-code":300,"test-code":519}},"authorContributionVariance":{"dwangwk":6817.128,"menatahari":56.0,"yespiggy":67.759995,"yeoshuheng":58870.8},"authorDisplayNameMap":{"dwangwk":"CS2103T-W09-2 WANG..NIEL","menatahari":"CS2103T-W09-2 NATA..HARI","yespiggy":"CS2103T-W09-2 YE S..IFAN","yeoshuheng":"CS2103T-W09-2 YEO ..HENG"}} +{"authorDailyContributionsMap":{"dwangwk":[{"date":"2024-03-07","commitResults":[{"hash":"1499dc1041a33dd81b79a49768feaa09e6621c28","isMergeCommit":false,"messageTitle":"Docs: Update Profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":48,"deletions":6}}},{"hash":"6f6620f8977c5667616382a2af02c2584d143ef0","isMergeCommit":false,"messageTitle":"Docs: Updated Readme, DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":230,"deletions":39}}},{"hash":"56d9b344a27da1a1ec908a06899ced743f39dea4","isMergeCommit":false,"messageTitle":"Docs: About Us Sifan Image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b76da9e9d536129352e67dec71a3206d94080289","isMergeCommit":true,"messageTitle":"Merge pull request #17 from dwangwk/master","messageBody":"Update AboutUs, Readme, DeveloperGuide","fileTypesAndContributionMap":{}},{"hash":"0844d885ce4b55a007c5404578cab6ca1434f513","isMergeCommit":false,"messageTitle":"Docs: Updated Photo Name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}],"menatahari":[{"date":"2024-03-07","commitResults":[{"hash":"a8eb93c0cd4a775db4eede5a6f03de2aed2148ad","isMergeCommit":false,"messageTitle":"Update readme and uploaded photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":11}}},{"hash":"2ab29ded407cf63b39c4cfea3ca859652647986d","isMergeCommit":true,"messageTitle":"Merge pull request #15 from menatahari/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"yespiggy":[{"date":"2024-03-07","commitResults":[{"hash":"84063188a916022bf2f1b80803f0b8d8b3b2dafc","isMergeCommit":false,"messageTitle":"docs: Update DG User stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":13}}},{"hash":"fa249d62a450e496f8bf4fa2a07b6ef4cd6ffadd","isMergeCommit":true,"messageTitle":"Merge branch update DG user stories","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"676d51e0b69796e8a04234d2c15b914329cd0c96","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yespiggy/master","messageBody":"Update user stories in DG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"c1be4f4bc81ea765a06e1efdd5a84627334a8475","isMergeCommit":false,"messageTitle":"docs: update website config file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"yeoshuheng":[{"date":"2024-02-25","commitResults":[{"hash":"842594880efd9ef12b06dd5f5716ce9d1c46de79","isMergeCommit":false,"messageTitle":"docs: Update profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":15}}},{"hash":"c0b6212b3fdc7805ddddcc7a791160c2730d1219","isMergeCommit":false,"messageTitle":"feat: Add Industry and FundingStage options","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":108,"deletions":5}}},{"hash":"9d4aa185e921f647f7079e1ec5eca32e36a298fa","isMergeCommit":false,"messageTitle":"feat: Add logic for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":43,"deletions":17}}},{"hash":"ccc8a41ac1e34edbcc7189e0198a3ba61210178e","isMergeCommit":false,"messageTitle":"feat: Add sample for person with industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":35,"deletions":13}}},{"hash":"078b9e51de07a37bc01af8b33991d63b78c98578","isMergeCommit":false,"messageTitle":"feat: Update storage for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":7}}},{"hash":"9ded1fc99b36c25649aa251c7c64d68005bc3d5a","isMergeCommit":false,"messageTitle":"test: Fix test for industry, funding","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":81,"deletions":26}}},{"hash":"38212e7a41db0be57ac52c5dc78795a5ffb6a434","isMergeCommit":false,"messageTitle":"feat: Add funding, industry for edit command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":36,"deletions":12}}},{"hash":"eb7c924496e743e877b752b944d33651d1978638","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for test","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":23,"deletions":5}}},{"hash":"1ede8657f049bee88e8b82f71417b1a8c8c2b6e4","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for main","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":73,"deletions":15}}},{"hash":"d178843dbf22a382046ba7a4beb1cb3437ae9814","isMergeCommit":false,"messageTitle":"test: Update test for funding, industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":176,"deletions":113}}},{"hash":"b2b9eb02bac1c24cc39fb2b8efc575a549532253","isMergeCommit":false,"messageTitle":"style: Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":17}}}]},{"date":"2024-03-05","commitResults":[{"hash":"fb1bdef18772248a883d4eb0421a4c45a370c70a","isMergeCommit":false,"messageTitle":"fix: Add duplicate prefix checks","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1},"test-code":{"insertions":120,"deletions":0}}},{"hash":"aec40a6d3b801a6ddd30ac670bf513461480bd2e","isMergeCommit":false,"messageTitle":"test: Add test for funding stage \u0026 industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":205,"deletions":131}}},{"hash":"b773e6b431bdc5d09ffce4a4356131af78ddb243","isMergeCommit":true,"messageTitle":"Merge pull request #1 from yeoshuheng/branch-AddStartup","messageBody":"Branch add startup","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"728b2c0b2837cc516dc425fbc49fee8fd092bcc8","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yeoshuheng/master","messageBody":"v1.1: Add startup \u0026 Assign Funding Stage","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"3d2e99f939f367257f2c910af59461e14544db3b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"6109993c1f7e29ed64a217e769a86d5cd1f9fecd","isMergeCommit":true,"messageTitle":"Merge pull request #18 from dwangwk/master","messageBody":"Docs: Updated Photo Name","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"8d568634d3b45cbfbacf3d19f762fcffee06538e","isMergeCommit":true,"messageTitle":"Merge pull request #22 from yespiggy/update-website-config","messageBody":"docs: update website config file","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dwangwk":{"docs":264,"functional-code":0,"test-code":0},"menatahari":{"docs":19,"functional-code":0,"test-code":0},"yespiggy":{"docs":17,"functional-code":0,"test-code":0},"yeoshuheng":{"docs":9,"functional-code":300,"test-code":519}},"authorContributionVariance":{"dwangwk":6065.6606,"menatahari":49.826992,"yespiggy":60.262974,"yeoshuheng":52785.67},"authorDisplayNameMap":{"dwangwk":"CS2103T-W09-2 WANG..NIEL","menatahari":"CS2103T-W09-2 NATA..HARI","yespiggy":"CS2103T-W09-2 YE S..IFAN","yeoshuheng":"CS2103T-W09-2 YEO ..HENG"}} diff --git a/AY2324S2-CS2103T-W10-2_tp_master/authorship.json b/AY2324S2-CS2103T-W10-2_tp_master/authorship.json index 8366d2f8..580d1017 100644 --- a/AY2324S2-CS2103T-W10-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W10-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joshy837"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Joshy837"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Joshy837"},"content":"## PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"This is an **address book for dog cafe owners**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Joshy837"},"content":"Example usages:","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Joshy837"},"content":"* as an address book to store contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Joshy837"},"content":"The project simulates an ongoing software project for a desktop application (called _PoochPlanner_) used for managing contact details.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Joshy837"},"content":"* It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Joshy837"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Joshy837"},"content":"* It is named `PoochPlanner` because it is meant for pooch (dog) cafe owners to manage their address books.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Joshy837"},"content":"* For the detailed documentation of this project, see **[PoochPlanner\u0027s Product Website](https://ay2324s2-cs2103t-w10-2.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Joshy837"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Joshy837":15,"-":1}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"### Lee Yi Lin","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"\u003cimg src\u003d\"images/yleeyilin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"yleeyilin"},"content":"[[github](https://github.com/yleeyilin)]","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"yleeyilin"},"content":"[[portfolio](team/yleeyilin.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"yleeyilin"},"content":"* Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"### James Sin","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":"\u003cimg src\u003d\"images/jamessinmaojun.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":"[[github](http://github.com/jamessinmaojun)]","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"jamessinmaojun"},"content":"[[portfolio](team/jamessinmaojun.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jamessinmaojun"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"jamessinmaojun"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"jannaleong"},"content":"### Leong Jia Yi, Janna","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"jannaleong"},"content":"\u003cimg src\u003d\"images/jannaleong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"jannaleong"},"content":"[[github](http://github.com/jannaleong)] [[portfolio](team/jannaleong.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"jannaleong"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jannaleong"},"content":"* Responsibilities: Overall project coordination, deliverables and deadlines","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Joshy837"},"content":"### Joshua Yip Sujun","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":"\u003cimg src\u003d\"images/joshy837.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"[[github](http://github.com/joshy837)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"[[portfolio](team/joshy837.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"Joshy837"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"### Chng Chia Geng","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"\u003cimg src\u003d\"images/chiageng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"[[github](http://github.com/chiageng)]","lastModifiedDate":"2024-03-01"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"[[portfolio](team/chiageng.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"Joshy837":2,"jamessinmaojun":6,"chiageng":8,"jannaleong":5,"-":30,"yleeyilin":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"jannaleong"},"content":"* Dog cafe owners who need to manage a team of staff, F\u0026B vendors \u0026 a dog maintainence team.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"jannaleong"},"content":"* Prefer typing over other types and is comfortable using CLI applications.","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"jannaleong"},"content":"**Value proposition**: PoochPlanner is a desktop application to track details of various groups (vendors, staff, dog maintainence) that dog cafe owners have to regularly interact with. ","lastModifiedDate":"2024-03-06"},{"lineNumber":269,"author":{"gitId":"jannaleong"},"content":"The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friendly Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"jannaleong"},"content":"| Priority | \u003cdiv style\u003d\"width:50px\"\u003eAs a …​\u003c/div\u003e | I want to …​ | So that I can…​ |","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"jannaleong"},"content":"|---------------|----------------------------------------|------------------------------------------------------------|-------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"jannaleong"},"content":"| `* * *` | well connected user | search contacts | save time |","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"jannaleong"},"content":"| `* * *` | well connected user | add contacts | have the address to contact others in the future |","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"jannaleong"},"content":"| `* * *` | cafe owner user | delete the contacts of people | keep my contacts updated and remove outdated contacts |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"jannaleong"},"content":"| `* * *` | long-term user | edit contacts | update some contact information |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"jannaleong"},"content":"| `* * *` | first-time user | get help about what commnads I can use on the contact book | easily know how to navigate the system |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"jannaleong"},"content":"| `**` | frugal user | sort my vendors in ascending order of price | view the vendors selling the cheapest products easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"jannaleong"},"content":"| `**` | careless user | undo my commands | fix mistakes easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"jannaleong"},"content":"| `**` | forgetful user | star contacts that are important | remember to contact them easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC01 - Add Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a new contact is added into list`","lastModifiedDate":"2024-03-01"},{"lineNumber":299,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":300,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"yleeyilin"},"content":"1. User requests to add contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms success update.","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":309,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the required field.","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects a duplicate name entry.","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters the correct command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until there is no duplicate entry in input.","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":324,"author":{"gitId":"chiageng"},"content":"* 1c. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":325,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":326,"author":{"gitId":"chiageng"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":327,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":328,"author":{"gitId":"chiageng"},"content":" * Steps 1c1 - 1c2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":329,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":330,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":331,"author":{"gitId":"chiageng"},"content":"* 1d. PoochPlanner detect unknown input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":332,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":333,"author":{"gitId":"chiageng"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":334,"author":{"gitId":"chiageng"},"content":" * 1d2. User re-enters the correct input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":335,"author":{"gitId":"chiageng"},"content":" * Steps 1d1 - 1d2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":336,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":338,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC02 - Delete Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":342,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":343,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is deleted from list`","lastModifiedDate":"2024-03-01"},{"lineNumber":346,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"yleeyilin"},"content":"1. User requests to delete contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":350,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner removes person and updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":351,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful deletion.","lastModifiedDate":"2024-02-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":356,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":357,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":358,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":359,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":360,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":361,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":362,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":363,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":364,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":365,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":366,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":367,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":368,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":369,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":370,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":371,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":372,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":373,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":374,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC03 - Edit Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":375,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":376,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":377,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":378,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is edited successfully in the list`","lastModifiedDate":"2024-03-01"},{"lineNumber":379,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":380,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":381,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":382,"author":{"gitId":"yleeyilin"},"content":"1. User requests to edit the field of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":383,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates the field of specified person.","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":385,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":388,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":397,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":399,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":400,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":401,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":402,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":404,"author":{"gitId":"yleeyilin"},"content":"* 1c. User requests to edit the name field to a name that already exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":405,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":406,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":407,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the command with a different name.","lastModifiedDate":"2024-03-02"},{"lineNumber":408,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until the new name field is valid.","lastModifiedDate":"2024-02-29"},{"lineNumber":409,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":410,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":411,"author":{"gitId":"yleeyilin"},"content":"* 1d. User did not specify the field that they want to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":412,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":413,"author":{"gitId":"yleeyilin"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":414,"author":{"gitId":"yleeyilin"},"content":" * 1d2. User re-enters the command and specify the field/s to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":415,"author":{"gitId":"yleeyilin"},"content":" * Steps 1d1 - 1d2 are repeated until there exist a specified field to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":416,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":417,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":418,"author":{"gitId":"yleeyilin"},"content":"* 1e. User specified an invalid field.","lastModifiedDate":"2024-02-29"},{"lineNumber":419,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":420,"author":{"gitId":"yleeyilin"},"content":" * 1e1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":421,"author":{"gitId":"yleeyilin"},"content":" * 1e2. User re-enters the command and edits a different field.","lastModifiedDate":"2024-02-29"},{"lineNumber":422,"author":{"gitId":"yleeyilin"},"content":" * Steps 1e1 - 1e2 are repeated until there exist a valid field in the input.","lastModifiedDate":"2024-02-29"},{"lineNumber":423,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":424,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":425,"author":{"gitId":"chiageng"},"content":"* 1f. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":426,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":427,"author":{"gitId":"chiageng"},"content":" * 1f1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":428,"author":{"gitId":"chiageng"},"content":" * 1f2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":429,"author":{"gitId":"chiageng"},"content":" * Steps 1f1 - 1f2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":430,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":431,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":432,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":433,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":434,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":435,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC04 - Search Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":436,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":437,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":438,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":439,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":440,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":441,"author":{"gitId":"yleeyilin"},"content":"1. User requests to search for the contact of a person with a keyword for a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":442,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner confirms successful search.","lastModifiedDate":"2024-02-29"},{"lineNumber":443,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner returns the sublist of contacts that contains the keyword specified by the user.","lastModifiedDate":"2024-02-29"},{"lineNumber":444,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":445,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":452,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":453,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":454,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":455,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":456,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects multiple fields in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":457,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":458,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":459,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with only one field.","lastModifiedDate":"2024-02-29"},{"lineNumber":460,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":461,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":462,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":463,"author":{"gitId":"yleeyilin"},"content":"* 1c. PoochPlanner detects invalid field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":464,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":465,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":466,"author":{"gitId":"yleeyilin"},"content":" * 1c2. User re-enters a new command with another field.","lastModifiedDate":"2024-02-29"},{"lineNumber":467,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":468,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":469,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":470,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":471,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":472,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":473,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC05 - Help Tutorial`","lastModifiedDate":"2024-02-29"},{"lineNumber":474,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":475,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":476,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":477,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":478,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":479,"author":{"gitId":"yleeyilin"},"content":"1. User requests to learn more about the commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":480,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner displays a tutorial information.","lastModifiedDate":"2024-02-29"},{"lineNumber":481,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":482,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":483,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":484,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":485,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":486,"author":{"gitId":"yleeyilin"},"content":"* 1a. User requests to learn about an invalid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":487,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":488,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":489,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the command and request to learn about a valid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":490,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid command is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":491,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":492,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":493,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":494,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"chiageng"},"content":"4. All code snippets presented in the developer guides shall follow a consistent coding style and formatting, adhering to the company\u0027s coding standards and best practices.","lastModifiedDate":"2024-03-01"},{"lineNumber":502,"author":{"gitId":"chiageng"},"content":"5. The developer guides shall undergo regular content audits, with outdated or deprecated information flagged for removal or revision, and new features or updates documented within one week of release.","lastModifiedDate":"2024-03-01"},{"lineNumber":503,"author":{"gitId":"chiageng"},"content":"6. The system should respond within 2 seconds.","lastModifiedDate":"2024-03-01"},{"lineNumber":504,"author":{"gitId":"chiageng"},"content":"7. The data should store locally and not accessible from other device for privacy issue.","lastModifiedDate":"2024-03-01"},{"lineNumber":505,"author":{"gitId":"chiageng"},"content":"8. The project is expected to adhere to schedule closely to deliver new feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"jamessinmaojun"},"content":"* **PoochPlanner**: An address book CLI software that stores contacts.","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Contact**: A contact that is stored in PoochPlanner.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Owner**: The target user of PoochPlanner; Dog Cafe owners.","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Client**: Patrons of the Dog Cafe.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Supplier**: External suppliers that sell the logistics required for the sustenance of Dog Cafe operations, for example Pooch Food, to the Pooch Cafe Owners at a fixed price.","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Staff**: Employees of the Dog Cafe that handle the running of the cafe.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Maintenance Staff**: Specialised external workers that take special care and maintenance of dogs.","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"chiageng":37,"jamessinmaojun":7,"jannaleong":14,"-":360,"yleeyilin":152}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"PoochPlanner is an **address book manager for managing contacts, optimised for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, PoochPlanner can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your PoochPlanner.","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" * `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time` : Adds a staff contact named `Poochie` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" * `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag` : Adds a supplier contact named `PetCo` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr` : Adds a helper contact named `Tom Tan` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * `/delete ; name : Poochie` : Deletes the contact with associated contact name.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" * `/exit` : Exits the app.","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"* Words in `[parameter name]` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" e.g. in `/pooch-staff ; name : [name]`, `[name]` is a parameter which can be used as `/pooch-staff ; name : Poochie`.","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" e.g. if the command specifies `name : [name] ; phone : [phone]`, `phone : [phone] ; name : [name]` is also acceptable.","lastModifiedDate":"2024-03-01"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `/list`, `/exit`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" e.g. if the command specifies `/list 123`, it will be interpreted as `/list`.","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"jannaleong"},"content":"Shows a message of how to write commands for all commands or a specfic command.","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"jannaleong"},"content":"### Get help for all commands","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"Format: `/help`","lastModifiedDate":"2024-03-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"jannaleong"},"content":"### Get help for a specific command","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":"Format: `/help ; command : [command type]`","lastModifiedDate":"2024-03-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"jannaleong"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-staff`","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-supplier`","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-maintenance`","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : edit`","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : search`","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":"### Adding a contact: `Add`","lastModifiedDate":"2024-03-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":"Adds a staff / supplier / helper to the Pooch Planner.","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":"#### Adds a staff","lastModifiedDate":"2024-03-01"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-staff ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; salary : [salary] ; employment : [part/full] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"#### Adds a supplier","lastModifiedDate":"2024-03-01"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-supplier ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; product : [product] ; price : [price] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":"#### Adds a helper","lastModifiedDate":"2024-03-01"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-maintenance ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; skill : [skill] ; commission : [commission] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":"* `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"* `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":"* `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":97,"author":{"gitId":"jannaleong"},"content":"Constraints :","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":"* `Duplicate name will not be allowed`","lastModifiedDate":"2024-03-01"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":"* `For instance, to check whether a name is unique (case-insensitive), we parse in the .lower() String method to convert all fields to lowercase.`","lastModifiedDate":"2024-03-01"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"* `Name field is case-insensitive but space-sensitive`","lastModifiedDate":"2024-03-01"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"yleeyilin"},"content":"### Editing a person : `Edit`","lastModifiedDate":"2024-02-28"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":"Edit the fields of the specified person in the Pooch Planner.","lastModifiedDate":"2024-03-07"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":"Format: `/edit ; name : [name] ; field { [field] : [value] }`","lastModifiedDate":"2024-03-07"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":108,"author":{"gitId":"yleeyilin"},"content":"* Edits the specified `field`(s) of the person with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":109,"author":{"gitId":"yleeyilin"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-28"},{"lineNumber":110,"author":{"gitId":"yleeyilin"},"content":"* At least one field must be provided.","lastModifiedDate":"2024-02-28"},{"lineNumber":111,"author":{"gitId":"yleeyilin"},"content":"* More than one field can be updated at the same time.","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"yleeyilin"},"content":"* The field(s) to be edited must be a valid field within their contact type, i.e. Pooch Staff, Pooch Supplier, Pooch Maintenance).","lastModifiedDate":"2024-02-28"},{"lineNumber":113,"author":{"gitId":"yleeyilin"},"content":"* **_Caution_** : Editing `name` field to another name that already exists in Pooch Contact Book is strictly **not** allowed.","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":115,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-02-28"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":"* `/edit ; name : Poochie ; field : { name : Mochie }`","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":118,"author":{"gitId":"yleeyilin"},"content":" The above command edits the name of the person, from **_Poochie_** to **_Mochie_**, given that there are no other persons with the name, **_Mochie_**, in the Pooch Contact Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":"* `/edit ; name : Thomas ; field : { address : Poochie Street 25 ; employment : full-time }`","lastModifiedDate":"2024-03-07"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":122,"author":{"gitId":"yleeyilin"},"content":" The above command edits the address of **_Thomas_** to **_Poochie Street 25_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":123,"author":{"gitId":"yleeyilin"},"content":" The above command also edits the employment of **_Thomas_**, which **must** be a **_Pooch Staff_**, to **_full-time_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":"Deletes the specified person from the Pooch Planner.","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":"Format: `/delete ; name : [name]`","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"jamessinmaojun"},"content":"* Deletes the contact with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"jamessinmaojun"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":"* `/delete ; name : Poochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":137,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Poochie_**, provided **_Poochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":138,"author":{"gitId":"jamessinmaojun"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":"* `/delete ; name : Moochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":141,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Moochie_**, provided **_Moochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"Joshy837"},"content":"### Searching a contact : `search`","lastModifiedDate":"2024-03-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":146,"author":{"gitId":"Joshy837"},"content":"Searches through the address book using specified fields and keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":147,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"Joshy837"},"content":"Formats:","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"Joshy837"},"content":"/search ; name : [full/partial name]","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"Joshy837"},"content":"/search ; phone : [full/partial phone]","lastModifiedDate":"2024-03-06"},{"lineNumber":152,"author":{"gitId":"Joshy837"},"content":"/search ; address : [full/partial address]","lastModifiedDate":"2024-03-06"},{"lineNumber":153,"author":{"gitId":"Joshy837"},"content":"/search ; email : [full/partial email]","lastModifiedDate":"2024-03-06"},{"lineNumber":154,"author":{"gitId":"Joshy837"},"content":"/search ; product : [full/partial product name]","lastModifiedDate":"2024-03-06"},{"lineNumber":155,"author":{"gitId":"Joshy837"},"content":"/search ; employment : [employment]","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":158,"author":{"gitId":"Joshy837"},"content":"* Searches the person by specifying field (i.e. `name`, `phone`, `address`, etc.), followed by the partial or full keyword","lastModifiedDate":"2024-03-06"},{"lineNumber":159,"author":{"gitId":"Joshy837"},"content":"* Current feature does not allow users to search for `commission`, `salary`, and `price`","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"Joshy837"},"content":"* All fields are **case-insensitive**.","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"Joshy837"},"content":"For instance, to check whether a name is unique (case-insensitive)","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"Joshy837"},"content":" * Eg : `Janna` and `janna` are both equivalent","lastModifiedDate":"2024-03-06"},{"lineNumber":163,"author":{"gitId":"Joshy837"},"content":"* Spaces within each input are considered","lastModifiedDate":"2024-03-06"},{"lineNumber":164,"author":{"gitId":"Joshy837"},"content":" * Eg: `Tom Tan Er` is different from `Tom Taner`","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"Joshy837"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"Joshy837"},"content":"/search ; name : Poochie","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"Joshy837"},"content":"/search ; phone : 98765432","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"Joshy837"},"content":"/search ; address : Poochie Street 21","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"Joshy837"},"content":"/search ; email : ilovecatstoo@gmail.com","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"Joshy837"},"content":"/search ; address : Pooch","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"Joshy837"},"content":"/search ; description : Food","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":"Format: `/exit`","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":189,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":"If your changes to the data file makes its format invalid, PoochPlanner will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":"Furthermore, certain edits can cause the PoochPlanner to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":196,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous PoochPlanner home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":211,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":213,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":215,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"chiageng"},"content":"**Add Staff** | `/pooch-staff ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; salary : [salary] ; employment : [part/full]` \u003cbr\u003e e.g., `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time`","lastModifiedDate":"2024-03-07"},{"lineNumber":220,"author":{"gitId":"chiageng"},"content":"**Add Supplier** | `/pooch-supplier ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; product : [product] ; price : [price]` \u003cbr\u003e e.g., `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag`","lastModifiedDate":"2024-03-07"},{"lineNumber":221,"author":{"gitId":"chiageng"},"content":"**Add Helper** | `/pooch-maintenance ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; skill : [skill] ; commission : [commission]` \u003cbr\u003e e.g., `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr`","lastModifiedDate":"2024-03-07"},{"lineNumber":222,"author":{"gitId":"chiageng"},"content":"**Delete** | `/delete name : [name] `\u003cbr\u003e e.g., `delete ; name : Poochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"chiageng"},"content":"**Edit** | `/edit ; name : [name] ; field : { field : data ; field : data }`\u003cbr\u003e e.g., `/edit ; name : Poochie ; field : { name : Mochi }` \u003cbr\u003e e.g.,`/edit ; name : Poochie ; field : { address : Poochie Street 25 ; employment : full-time }`","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"chiageng"},"content":"**Search** | `/search ; parameter : [value]`\u003cbr\u003e e.g., `/search ; name : Poochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"chiageng"},"content":"**List** | `/list`","lastModifiedDate":"2024-03-07"},{"lineNumber":226,"author":{"gitId":"chiageng"},"content":"**Help** | `/help`","lastModifiedDate":"2024-03-07"},{"lineNumber":227,"author":{"gitId":"chiageng"},"content":"**Help Command Format** | `/help ; command : [command]` \u003cbr\u003e e.g., `/help ; command : pooch-staff` \u003cbr\u003e e.g., `/help ; command : delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":228,"author":{"gitId":"chiageng"},"content":"`","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Joshy837":29,"chiageng":49,"jamessinmaojun":5,"jannaleong":11,"-":123,"yleeyilin":11}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"jamessinmaojun"},"content":" content: \"PoochPlanner\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"jamessinmaojun":1,"-":294}},{"path":"docs/team/chiageng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"layout: page","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"title: Chia Geng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"* **New Feature**: Added the ability to add contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" * What it does: allows the user to add a new contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" * Justification: This feature improves the product significantly because a user can store all contacts in this address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-01"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-01"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" * Added documentation for the features `add` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" * Added non functional requirements.","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" * Updated use cases for PoochPlanner.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"chiageng":25}},{"path":"docs/team/jamessinmaojun.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"jamessinmaojun"},"content":"layout: page","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"jamessinmaojun"},"content":"title: James\u0027 Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"jamessinmaojun"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"jamessinmaojun"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"jamessinmaojun"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"jamessinmaojun"},"content":"* **New Feature**: Added the ability to delete contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"jamessinmaojun"},"content":" * What it does: allows the user to delete a certain contact, one at a time.","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"jamessinmaojun"},"content":" * Justification: This feature improves the product significantly because the address book can become too long and cluttered over time. Given the nature of the target users\u0027 business, contact turnover rate is expected to be very high and thus deleting unused contacts proves to be useful.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"jamessinmaojun"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"jamessinmaojun"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"jamessinmaojun"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"jamessinmaojun"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":" * Added documentation for the feature `delete` [\\#29]()","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"jamessinmaojun"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":" * Added use cases for PoochPlanner [\\#30]()","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"jamessinmaojun":24}},{"path":"docs/team/jannaleong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jannaleong"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jannaleong"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jannaleong"},"content":"title: Janna\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jannaleong"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jannaleong"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jannaleong"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jannaleong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jannaleong"},"content":"* **New Feature**: Added the ability to give help to users regarding commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jannaleong"},"content":" * What it does: Returns the user the correct command format for specific commands or all commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jannaleong"},"content":" * Justification: This feature is crucial for first time users who are unfamiliar to the commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jannaleong"},"content":" * Highlights: This enhancement is affected by existing commands and must be updated to accomodate to new commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jannaleong"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jannaleong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jannaleong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jannaleong"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jannaleong"},"content":" * Added documentation for the feature `help` [\\#17]())","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jannaleong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jannaleong"},"content":" * Added target user profile, value proposition, and user stories [\\#19]())","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jannaleong":24}},{"path":"docs/team/joshy837.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joshy837"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"Joshy837"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Joshy837"},"content":"title: Joshua Yip\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Joshy837"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Joshy837"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Joshy837"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Joshy837"},"content":"* **New Feature**: Added the ability to search contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Joshy837"},"content":" * What it does: allows the user to search a contact within a field using a specified keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Joshy837"},"content":" * Justification: This feature improves the product significantly because a user can search contacts in this address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Joshy837"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Joshy837"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"Joshy837"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"Joshy837"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"Joshy837"},"content":" * README:","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"Joshy837"},"content":" * Updated README for PoochPlanner [\\#15]()","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"Joshy837"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"Joshy837"},"content":" * Added documentation for the features `search` [\\#25]()","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Joshy837":24}},{"path":"docs/team/yleeyilin.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"yleeyilin"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"yleeyilin"},"content":"title: Yi Lin\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"yleeyilin"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"yleeyilin"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"* **New Feature**: Added the ability to edit previous contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"yleeyilin"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"yleeyilin"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"yleeyilin"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"yleeyilin"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"yleeyilin"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"yleeyilin"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"yleeyilin"},"content":" * Added documentation for the feature `edit` [\\#29]())","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"yleeyilin"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"yleeyilin"},"content":" * Added use cases for PoochPlanner [\\#30]())","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"yleeyilin":24}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joshy837"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Joshy837"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Joshy837"},"content":"## PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"This is an **address book for dog cafe owners**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Joshy837"},"content":"Example usages:","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Joshy837"},"content":"* as an address book to store contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Joshy837"},"content":"The project simulates an ongoing software project for a desktop application (called _PoochPlanner_) used for managing contact details.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Joshy837"},"content":"* It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Joshy837"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Joshy837"},"content":"* It is named `PoochPlanner` because it is meant for pooch (dog) cafe owners to manage their address books.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Joshy837"},"content":"* For the detailed documentation of this project, see **[PoochPlanner\u0027s Product Website](https://ay2324s2-cs2103t-w10-2.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Joshy837"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Joshy837":15,"-":1}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"### Lee Yi Lin","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"\u003cimg src\u003d\"images/yleeyilin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"yleeyilin"},"content":"[[github](https://github.com/yleeyilin)]","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"yleeyilin"},"content":"[[portfolio](team/yleeyilin.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"yleeyilin"},"content":"* Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"### James Sin","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":"\u003cimg src\u003d\"images/jamessinmaojun.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":"[[github](http://github.com/jamessinmaojun)]","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"jamessinmaojun"},"content":"[[portfolio](team/jamessinmaojun.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jamessinmaojun"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"jamessinmaojun"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"jannaleong"},"content":"### Leong Jia Yi, Janna","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"jannaleong"},"content":"\u003cimg src\u003d\"images/jannaleong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"jannaleong"},"content":"[[github](http://github.com/jannaleong)] [[portfolio](team/jannaleong.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"jannaleong"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jannaleong"},"content":"* Responsibilities: Overall project coordination, deliverables and deadlines","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Joshy837"},"content":"### Joshua Yip Sujun","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":"\u003cimg src\u003d\"images/joshy837.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"[[github](http://github.com/joshy837)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"[[portfolio](team/joshy837.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"Joshy837"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"### Chng Chia Geng","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"\u003cimg src\u003d\"images/chiageng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"[[github](http://github.com/chiageng)]","lastModifiedDate":"2024-03-01"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"[[portfolio](team/chiageng.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"Joshy837":2,"jamessinmaojun":6,"chiageng":8,"jannaleong":5,"-":30,"yleeyilin":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"jannaleong"},"content":"* Dog cafe owners who need to manage a team of staff, F\u0026B vendors \u0026 a dog maintainence team.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"jannaleong"},"content":"* Prefer typing over other types and is comfortable using CLI applications.","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"jannaleong"},"content":"**Value proposition**: PoochPlanner is a desktop application to track details of various groups (vendors, staff, dog maintainence) that dog cafe owners have to regularly interact with. ","lastModifiedDate":"2024-03-06"},{"lineNumber":269,"author":{"gitId":"jannaleong"},"content":"The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friendly Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"jannaleong"},"content":"| Priority | \u003cdiv style\u003d\"width:50px\"\u003eAs a …​\u003c/div\u003e | I want to …​ | So that I can…​ |","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"jannaleong"},"content":"|---------------|----------------------------------------|------------------------------------------------------------|-------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"jannaleong"},"content":"| `* * *` | well connected user | search contacts | save time |","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"jannaleong"},"content":"| `* * *` | well connected user | add contacts | have the address to contact others in the future |","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"jannaleong"},"content":"| `* * *` | cafe owner user | delete the contacts of people | keep my contacts updated and remove outdated contacts |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"jannaleong"},"content":"| `* * *` | long-term user | edit contacts | update some contact information |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"jannaleong"},"content":"| `* * *` | first-time user | get help about what commnads I can use on the contact book | easily know how to navigate the system |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"jannaleong"},"content":"| `**` | frugal user | sort my vendors in ascending order of price | view the vendors selling the cheapest products easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"jannaleong"},"content":"| `**` | careless user | undo my commands | fix mistakes easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"jannaleong"},"content":"| `**` | forgetful user | star contacts that are important | remember to contact them easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC01 - Add Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a new contact is added into list`","lastModifiedDate":"2024-03-01"},{"lineNumber":299,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":300,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"yleeyilin"},"content":"1. User requests to add contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms success update.","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":309,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the required field.","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects a duplicate name entry.","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters the correct command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until there is no duplicate entry in input.","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":324,"author":{"gitId":"chiageng"},"content":"* 1c. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":325,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":326,"author":{"gitId":"chiageng"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":327,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":328,"author":{"gitId":"chiageng"},"content":" * Steps 1c1 - 1c2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":329,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":330,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":331,"author":{"gitId":"chiageng"},"content":"* 1d. PoochPlanner detect unknown input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":332,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":333,"author":{"gitId":"chiageng"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":334,"author":{"gitId":"chiageng"},"content":" * 1d2. User re-enters the correct input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":335,"author":{"gitId":"chiageng"},"content":" * Steps 1d1 - 1d2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":336,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":338,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC02 - Delete Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":342,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":343,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is deleted from list`","lastModifiedDate":"2024-03-01"},{"lineNumber":346,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"yleeyilin"},"content":"1. User requests to delete contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":350,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner removes person and updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":351,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful deletion.","lastModifiedDate":"2024-02-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":356,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":357,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":358,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":359,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":360,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":361,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":362,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":363,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":364,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":365,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":366,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":367,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":368,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":369,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":370,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":371,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":372,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":373,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":374,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC03 - Edit Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":375,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":376,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":377,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":378,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is edited successfully in the list`","lastModifiedDate":"2024-03-01"},{"lineNumber":379,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":380,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":381,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":382,"author":{"gitId":"yleeyilin"},"content":"1. User requests to edit the field of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":383,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates the field of specified person.","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":385,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":388,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":397,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":399,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":400,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":401,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":402,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":404,"author":{"gitId":"yleeyilin"},"content":"* 1c. User requests to edit the name field to a name that already exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":405,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":406,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":407,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the command with a different name.","lastModifiedDate":"2024-03-02"},{"lineNumber":408,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until the new name field is valid.","lastModifiedDate":"2024-02-29"},{"lineNumber":409,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":410,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":411,"author":{"gitId":"yleeyilin"},"content":"* 1d. User did not specify the field that they want to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":412,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":413,"author":{"gitId":"yleeyilin"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":414,"author":{"gitId":"yleeyilin"},"content":" * 1d2. User re-enters the command and specify the field/s to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":415,"author":{"gitId":"yleeyilin"},"content":" * Steps 1d1 - 1d2 are repeated until there exist a specified field to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":416,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":417,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":418,"author":{"gitId":"yleeyilin"},"content":"* 1e. User specified an invalid field.","lastModifiedDate":"2024-02-29"},{"lineNumber":419,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":420,"author":{"gitId":"yleeyilin"},"content":" * 1e1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":421,"author":{"gitId":"yleeyilin"},"content":" * 1e2. User re-enters the command and edits a different field.","lastModifiedDate":"2024-02-29"},{"lineNumber":422,"author":{"gitId":"yleeyilin"},"content":" * Steps 1e1 - 1e2 are repeated until there exist a valid field in the input.","lastModifiedDate":"2024-02-29"},{"lineNumber":423,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":424,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":425,"author":{"gitId":"chiageng"},"content":"* 1f. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":426,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":427,"author":{"gitId":"chiageng"},"content":" * 1f1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":428,"author":{"gitId":"chiageng"},"content":" * 1f2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":429,"author":{"gitId":"chiageng"},"content":" * Steps 1f1 - 1f2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":430,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":431,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":432,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":433,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":434,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":435,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC04 - Search Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":436,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":437,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":438,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":439,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":440,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":441,"author":{"gitId":"yleeyilin"},"content":"1. User requests to search for the contact of a person with a keyword for a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":442,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner confirms successful search.","lastModifiedDate":"2024-02-29"},{"lineNumber":443,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner returns the sublist of contacts that contains the keyword specified by the user.","lastModifiedDate":"2024-02-29"},{"lineNumber":444,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":445,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":452,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":453,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":454,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":455,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":456,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects multiple fields in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":457,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":458,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":459,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with only one field.","lastModifiedDate":"2024-02-29"},{"lineNumber":460,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":461,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":462,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":463,"author":{"gitId":"yleeyilin"},"content":"* 1c. PoochPlanner detects invalid field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":464,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":465,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":466,"author":{"gitId":"yleeyilin"},"content":" * 1c2. User re-enters a new command with another field.","lastModifiedDate":"2024-02-29"},{"lineNumber":467,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":468,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":469,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":470,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":471,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":472,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":473,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC05 - Help Tutorial`","lastModifiedDate":"2024-02-29"},{"lineNumber":474,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":475,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":476,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":477,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":478,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":479,"author":{"gitId":"yleeyilin"},"content":"1. User requests to learn more about the commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":480,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner displays a tutorial information.","lastModifiedDate":"2024-02-29"},{"lineNumber":481,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":482,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":483,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":484,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":485,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":486,"author":{"gitId":"yleeyilin"},"content":"* 1a. User requests to learn about an invalid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":487,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":488,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":489,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the command and request to learn about a valid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":490,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid command is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":491,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":492,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":493,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":494,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"chiageng"},"content":"4. All code snippets presented in the developer guides shall follow a consistent coding style and formatting, adhering to the company\u0027s coding standards and best practices.","lastModifiedDate":"2024-03-01"},{"lineNumber":502,"author":{"gitId":"chiageng"},"content":"5. The developer guides shall undergo regular content audits, with outdated or deprecated information flagged for removal or revision, and new features or updates documented within one week of release.","lastModifiedDate":"2024-03-01"},{"lineNumber":503,"author":{"gitId":"chiageng"},"content":"6. The system should respond within 2 seconds.","lastModifiedDate":"2024-03-01"},{"lineNumber":504,"author":{"gitId":"chiageng"},"content":"7. The data should store locally and not accessible from other device for privacy issue.","lastModifiedDate":"2024-03-01"},{"lineNumber":505,"author":{"gitId":"chiageng"},"content":"8. The project is expected to adhere to schedule closely to deliver new feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"jamessinmaojun"},"content":"* **PoochPlanner**: An address book CLI software that stores contacts.","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Contact**: A contact that is stored in PoochPlanner.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Owner**: The target user of PoochPlanner; Dog Cafe owners.","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Client**: Patrons of the Dog Cafe.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Supplier**: External suppliers that sell the logistics required for the sustenance of Dog Cafe operations, for example Pooch Food, to the Pooch Cafe Owners at a fixed price.","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Staff**: Employees of the Dog Cafe that handle the running of the cafe.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Maintenance Staff**: Specialised external workers that take special care and maintenance of dogs.","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"chiageng":37,"jamessinmaojun":7,"jannaleong":14,"-":360,"yleeyilin":152}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"PoochPlanner is an **address book manager for managing contacts, optimised for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, PoochPlanner can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your PoochPlanner.","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" * `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time` : Adds a staff contact named `Poochie` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" * `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag` : Adds a supplier contact named `PetCo` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr` : Adds a helper contact named `Tom Tan` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * `/delete ; name : Poochie` : Deletes the contact with associated contact name.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" * `/exit` : Exits the app.","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"* Words in `[parameter name]` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" e.g. in `/pooch-staff ; name : [name]`, `[name]` is a parameter which can be used as `/pooch-staff ; name : Poochie`.","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" e.g. if the command specifies `name : [name] ; phone : [phone]`, `phone : [phone] ; name : [name]` is also acceptable.","lastModifiedDate":"2024-03-01"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `/list`, `/exit`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" e.g. if the command specifies `/list 123`, it will be interpreted as `/list`.","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"jannaleong"},"content":"Shows a message of how to write commands for all commands or a specfic command.","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"jannaleong"},"content":"### Get help for all commands","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"Format: `/help`","lastModifiedDate":"2024-03-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"jannaleong"},"content":"### Get help for a specific command","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":"Format: `/help ; command : [command type]`","lastModifiedDate":"2024-03-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"jannaleong"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-staff`","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-supplier`","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-maintenance`","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : edit`","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : search`","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":"### Adding a contact: `Add`","lastModifiedDate":"2024-03-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":"Adds a staff / supplier / helper to the Pooch Planner.","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":"#### Adds a staff","lastModifiedDate":"2024-03-01"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-staff ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; salary : [salary] ; employment : [part/full] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"#### Adds a supplier","lastModifiedDate":"2024-03-01"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-supplier ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; product : [product] ; price : [price] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":"#### Adds a helper","lastModifiedDate":"2024-03-01"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-maintenance ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; skill : [skill] ; commission : [commission] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":"* `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"* `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":"* `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":97,"author":{"gitId":"jannaleong"},"content":"Constraints :","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":"* `Duplicate name will not be allowed`","lastModifiedDate":"2024-03-01"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":"* `For instance, to check whether a name is unique (case-insensitive), we parse in the .lower() String method to convert all fields to lowercase.`","lastModifiedDate":"2024-03-01"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"* `Name field is case-insensitive but space-sensitive`","lastModifiedDate":"2024-03-01"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"yleeyilin"},"content":"### Editing a person : `Edit`","lastModifiedDate":"2024-02-28"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":"Edit the fields of the specified person in the Pooch Planner.","lastModifiedDate":"2024-03-07"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":"Format: `/edit ; name : [name] ; field { [field] : [value] }`","lastModifiedDate":"2024-03-07"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":108,"author":{"gitId":"yleeyilin"},"content":"* Edits the specified `field`(s) of the person with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":109,"author":{"gitId":"yleeyilin"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-28"},{"lineNumber":110,"author":{"gitId":"yleeyilin"},"content":"* At least one field must be provided.","lastModifiedDate":"2024-02-28"},{"lineNumber":111,"author":{"gitId":"yleeyilin"},"content":"* More than one field can be updated at the same time.","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"yleeyilin"},"content":"* The field(s) to be edited must be a valid field within their contact type, i.e. Pooch Staff, Pooch Supplier, Pooch Maintenance).","lastModifiedDate":"2024-02-28"},{"lineNumber":113,"author":{"gitId":"yleeyilin"},"content":"* **_Caution_** : Editing `name` field to another name that already exists in Pooch Contact Book is strictly **not** allowed.","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":115,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-02-28"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":"* `/edit ; name : Poochie ; field : { name : Mochie }`","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":118,"author":{"gitId":"yleeyilin"},"content":" The above command edits the name of the person, from **_Poochie_** to **_Mochie_**, given that there are no other persons with the name, **_Mochie_**, in the Pooch Contact Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":"* `/edit ; name : Thomas ; field : { address : Poochie Street 25 ; employment : full-time }`","lastModifiedDate":"2024-03-07"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":122,"author":{"gitId":"yleeyilin"},"content":" The above command edits the address of **_Thomas_** to **_Poochie Street 25_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":123,"author":{"gitId":"yleeyilin"},"content":" The above command also edits the employment of **_Thomas_**, which **must** be a **_Pooch Staff_**, to **_full-time_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":"Deletes the specified person from the Pooch Planner.","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":"Format: `/delete ; name : [name]`","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"jamessinmaojun"},"content":"* Deletes the contact with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"jamessinmaojun"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":"* `/delete ; name : Poochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":137,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Poochie_**, provided **_Poochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":138,"author":{"gitId":"jamessinmaojun"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":"* `/delete ; name : Moochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":141,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Moochie_**, provided **_Moochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"Joshy837"},"content":"### Searching a contact : `search`","lastModifiedDate":"2024-03-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":146,"author":{"gitId":"Joshy837"},"content":"Searches through the address book using specified fields and keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":147,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"Joshy837"},"content":"Formats:","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"Joshy837"},"content":"/search ; name : [full/partial name]","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"Joshy837"},"content":"/search ; phone : [full/partial phone]","lastModifiedDate":"2024-03-06"},{"lineNumber":152,"author":{"gitId":"Joshy837"},"content":"/search ; address : [full/partial address]","lastModifiedDate":"2024-03-06"},{"lineNumber":153,"author":{"gitId":"Joshy837"},"content":"/search ; email : [full/partial email]","lastModifiedDate":"2024-03-06"},{"lineNumber":154,"author":{"gitId":"Joshy837"},"content":"/search ; product : [full/partial product name]","lastModifiedDate":"2024-03-06"},{"lineNumber":155,"author":{"gitId":"Joshy837"},"content":"/search ; employment : [employment]","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":158,"author":{"gitId":"Joshy837"},"content":"* Searches the person by specifying field (i.e. `name`, `phone`, `address`, etc.), followed by the partial or full keyword","lastModifiedDate":"2024-03-06"},{"lineNumber":159,"author":{"gitId":"Joshy837"},"content":"* Current feature does not allow users to search for `commission`, `salary`, and `price`","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"Joshy837"},"content":"* All fields are **case-insensitive**.","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"Joshy837"},"content":"For instance, to check whether a name is unique (case-insensitive)","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"Joshy837"},"content":" * Eg : `Janna` and `janna` are both equivalent","lastModifiedDate":"2024-03-06"},{"lineNumber":163,"author":{"gitId":"Joshy837"},"content":"* Spaces within each input are considered","lastModifiedDate":"2024-03-06"},{"lineNumber":164,"author":{"gitId":"Joshy837"},"content":" * Eg: `Tom Tan Er` is different from `Tom Taner`","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"Joshy837"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"Joshy837"},"content":"/search ; name : Poochie","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"Joshy837"},"content":"/search ; phone : 98765432","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"Joshy837"},"content":"/search ; address : Poochie Street 21","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"Joshy837"},"content":"/search ; email : ilovecatstoo@gmail.com","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"Joshy837"},"content":"/search ; address : Pooch","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"Joshy837"},"content":"/search ; description : Food","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":"Format: `/exit`","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":189,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":"If your changes to the data file makes its format invalid, PoochPlanner will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":"Furthermore, certain edits can cause the PoochPlanner to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":196,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous PoochPlanner home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":211,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":213,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":215,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"chiageng"},"content":"**Add Staff** | `/pooch-staff ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; salary : [salary] ; employment : [part/full]` \u003cbr\u003e e.g., `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time`","lastModifiedDate":"2024-03-07"},{"lineNumber":220,"author":{"gitId":"chiageng"},"content":"**Add Supplier** | `/pooch-supplier ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; product : [product] ; price : [price]` \u003cbr\u003e e.g., `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag`","lastModifiedDate":"2024-03-07"},{"lineNumber":221,"author":{"gitId":"chiageng"},"content":"**Add Helper** | `/pooch-maintenance ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; skill : [skill] ; commission : [commission]` \u003cbr\u003e e.g., `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr`","lastModifiedDate":"2024-03-07"},{"lineNumber":222,"author":{"gitId":"chiageng"},"content":"**Delete** | `/delete name : [name] `\u003cbr\u003e e.g., `delete ; name : Poochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"chiageng"},"content":"**Edit** | `/edit ; name : [name] ; field : { field : data ; field : data }`\u003cbr\u003e e.g., `/edit ; name : Poochie ; field : { name : Mochi }` \u003cbr\u003e e.g.,`/edit ; name : Poochie ; field : { address : Poochie Street 25 ; employment : full-time }`","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"chiageng"},"content":"**Search** | `/search ; parameter : [value]`\u003cbr\u003e e.g., `/search ; name : Poochie`","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"chiageng"},"content":"**List** | `/list`","lastModifiedDate":"2024-03-07"},{"lineNumber":226,"author":{"gitId":"chiageng"},"content":"**Help** | `/help`","lastModifiedDate":"2024-03-07"},{"lineNumber":227,"author":{"gitId":"chiageng"},"content":"**Help Command Format** | `/help ; command : [command]` \u003cbr\u003e e.g., `/help ; command : pooch-staff` \u003cbr\u003e e.g., `/help ; command : delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":228,"author":{"gitId":"chiageng"},"content":"`","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Joshy837":29,"chiageng":49,"jamessinmaojun":5,"jannaleong":11,"-":123,"yleeyilin":11}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"jamessinmaojun"},"content":" content: \"PoochPlanner\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"jamessinmaojun":1,"-":294}},{"path":"docs/team/chiageng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"layout: page","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"title: Chia Geng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"* **New Feature**: Added the ability to add 4 different type of contacts. (Pull requests [\\#57]())","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" * What it does: allows the user to add a new contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" * Justification: This feature improves the product significantly because a user can store all contacts in this address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-01"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"* **Storing Json** : Handled the serialization of different type of contacts to store as JSON objects. (Pull requests [\\#57]())","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" * What it does: store different type of contact into JSON object.","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" * Justification: This feature improves the product significantly because a user can store all contacts into local storage.","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" * Highlights: This enhancement affects existing project structure. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing project structure.","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"* **Reading Json** : Handled the serialization of reading different type of contacts from JSON file. (Pull requests [\\#57]())","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" * What it does: read different type of contact from JSON file.","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" * Justification: This feature improves the product significantly because a user can retrieve all contacts from local storage.","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" * Highlights: This enhancement affects existing project structure. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing project structure.","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" * Updated the GUI for display different type of contacts (Pull requests [\\#57]())","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * Added documentation for the features `add` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" * Added non functional requirements.","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" * Updated use cases for PoochPlanner.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"chiageng":37}},{"path":"docs/team/jamessinmaojun.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"jamessinmaojun"},"content":"layout: page","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"jamessinmaojun"},"content":"title: James\u0027 Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"jamessinmaojun"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"jamessinmaojun"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"jamessinmaojun"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"jamessinmaojun"},"content":"* **New Feature**: Added the ability to delete contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"jamessinmaojun"},"content":" * What it does: allows the user to delete a certain contact, one at a time.","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"jamessinmaojun"},"content":" * Justification: This feature improves the product significantly because the address book can become too long and cluttered over time. Given the nature of the target users\u0027 business, contact turnover rate is expected to be very high and thus deleting unused contacts proves to be useful.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"jamessinmaojun"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"jamessinmaojun"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"jamessinmaojun"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"jamessinmaojun"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":" * Added documentation for the feature `delete` [\\#29]()","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"jamessinmaojun"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":" * Added use cases for PoochPlanner [\\#30]()","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"jamessinmaojun":24}},{"path":"docs/team/jannaleong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jannaleong"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jannaleong"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jannaleong"},"content":"title: Janna\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jannaleong"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jannaleong"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jannaleong"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jannaleong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jannaleong"},"content":"* **New Feature**: Added the ability to give help to users regarding commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jannaleong"},"content":" * What it does: Returns the user the correct command format for specific commands or all commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jannaleong"},"content":" * Justification: This feature is crucial for first time users who are unfamiliar to the commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jannaleong"},"content":" * Highlights: This enhancement is affected by existing commands and must be updated to accomodate to new commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jannaleong"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jannaleong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jannaleong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jannaleong"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jannaleong"},"content":" * Added documentation for the feature `help` [\\#17]())","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jannaleong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jannaleong"},"content":" * Added target user profile, value proposition, and user stories [\\#19]())","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jannaleong":24}},{"path":"docs/team/joshy837.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joshy837"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"Joshy837"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Joshy837"},"content":"title: Joshua Yip\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Joshy837"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Joshy837"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Joshy837"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Joshy837"},"content":"* **New Feature**: Added the ability to search contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Joshy837"},"content":" * What it does: allows the user to search a contact within a field using a specified keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Joshy837"},"content":" * Justification: This feature improves the product significantly because a user can search contacts in this address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Joshy837"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Joshy837"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"Joshy837"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"Joshy837"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"Joshy837"},"content":" * README:","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"Joshy837"},"content":" * Updated README for PoochPlanner [\\#15]()","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"Joshy837"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"Joshy837"},"content":" * Added documentation for the features `search` [\\#25]()","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Joshy837":24}},{"path":"docs/team/yleeyilin.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"yleeyilin"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"yleeyilin"},"content":"title: Yi Lin\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"yleeyilin"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"yleeyilin"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"* **New Feature**: Added the ability to edit previous contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"yleeyilin"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"yleeyilin"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"yleeyilin"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"yleeyilin"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"yleeyilin"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"yleeyilin"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"yleeyilin"},"content":" * Added documentation for the feature `edit` [\\#29]())","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"yleeyilin"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"yleeyilin"},"content":" * Added use cases for PoochPlanner [\\#30]())","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"yleeyilin":24}},{"path":"src/main/java/seedu/address/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" public static final String COMMAND_WORD \u003d \"/pooch-add\";","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" + \"\\n\"","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" + PREFIX_NAME + \"John Doe other \"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \";","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person\u0027s name already exists in the address book\";","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"chiageng":5,"-":76}},{"path":"src/main/java/seedu/address/logic/commands/AddMaintainerCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_COMMISSION;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SKILL;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" * Adds a person to the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"public class AddMaintainerCommand extends Command {","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public static final String COMMAND_WORD \u003d \"/pooch-maintenance\";","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a maintainer to the address book. \"","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" + \"Parameters: \"","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" + PREFIX_SKILL + \"SKILL \"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" + PREFIX_COMMISSION + \"COMMISSION \\n\"","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" + PREFIX_NAME + \"John Doe trainer \"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" + PREFIX_SKILL + \"train dog \"","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" + PREFIX_COMMISSION + \"$50/hr\";","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New maintainer is added: %1$s\";","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person\u0027s name already exists in the address book\";","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" private final Maintainer toAdd;","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" public AddMaintainerCommand(Maintainer person) {","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" toAdd \u003d person;","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" requireNonNull(model);","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof AddMaintainerCommand)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand otherAddCommand \u003d (AddMaintainerCommand) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2024-03-08"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-08"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2024-03-08"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" .toString();","lastModifiedDate":"2024-03-08"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":86}},{"path":"src/main/java/seedu/address/logic/commands/AddStaffCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMPLOYMENT;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" * Adds a person to the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"public class AddStaffCommand extends Command {","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public static final String COMMAND_WORD \u003d \"/pooch-staff\";","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a staff to the address book. \"","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" + \"Parameters: \"","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" + PREFIX_SALARY + \"SALARY \"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMPLOYMENT + \"EMPLOYMENT \\n\"","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" + PREFIX_NAME + \"John Doe staff \"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" + PREFIX_SALARY + \"$50/hr \"","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMPLOYMENT + \"part-time\";","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New staff is added: %1$s\";","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person\u0027s name already exists in the address book\";","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" private final Staff toAdd;","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" public AddStaffCommand(Staff person) {","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" toAdd \u003d person;","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" requireNonNull(model);","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof AddStaffCommand)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" AddStaffCommand otherAddCommand \u003d (AddStaffCommand) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2024-03-08"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-08"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2024-03-08"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" .toString();","lastModifiedDate":"2024-03-08"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":86}},{"path":"src/main/java/seedu/address/logic/commands/AddSupplierCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRICE;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRODUCT;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" * Adds a person to the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"public class AddSupplierCommand extends Command {","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public static final String COMMAND_WORD \u003d \"/pooch-supplier\";","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a supplier to the address book. \"","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" + \"Parameters: \"","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" + PREFIX_PRODUCT + \"PRODUCT \"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" + PREFIX_PRICE + \"PRICE \\n\"","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" + PREFIX_NAME + \"John Doe supplier \"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" + PREFIX_PRODUCT + \"poochie food \"","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" + PREFIX_PRICE + \"$50/bag\";","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New supplier is added: %1$s\";","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person\u0027s name already exists in the address book\";","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" private final Supplier toAdd;","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" public AddSupplierCommand(Supplier person) {","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" toAdd \u003d person;","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" requireNonNull(model);","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof AddSupplierCommand)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand otherAddCommand \u003d (AddSupplierCommand) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2024-03-08"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-08"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2024-03-08"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" .toString();","lastModifiedDate":"2024-03-08"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":86}},{"path":"src/main/java/seedu/address/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import java.util.HashSet;","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-03-17"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-03-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-03-17"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-03-17"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-03-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-17"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":36,"author":{"gitId":"-"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" Tag tag \u003d new Tag(\"other\");","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" Person person \u003d new Person(name, phone, email, address, tags);","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"chiageng":6,"-":56}},{"path":"src/main/java/seedu/address/logic/parser/AddMaintainerCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_COMMISSION;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SKILL;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import java.util.HashSet;","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddMaintainerCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" * Parses input arguments and creates a new AddStaffCommand object","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"public class AddMaintainerCommandParser implements Parser\u003cAddMaintainerCommand\u003e {","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * Parses the given {@code String} of arguments in the context of the AddStaffCommand","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" public AddMaintainerCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" PREFIX_SKILL, PREFIX_COMMISSION);","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL,","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" PREFIX_SKILL, PREFIX_COMMISSION)","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddMaintainerCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" PREFIX_SKILL, PREFIX_COMMISSION);","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" Tag tag \u003d new Tag(\"maintainer\");","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" Skill skill \u003d ParserUtil.parseSkill(argMultimap.getValue(PREFIX_SKILL).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" Commission commission \u003d ParserUtil.parseCommission(argMultimap.getValue(PREFIX_COMMISSION).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" Maintainer person \u003d new Maintainer(name, phone, email, address, tags, skill, commission);","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" return new AddMaintainerCommand(person);","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":72}},{"path":"src/main/java/seedu/address/logic/parser/AddStaffCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMPLOYMENT;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import java.util.HashSet;","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddStaffCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" * Parses input arguments and creates a new AddStaffCommand object","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"public class AddStaffCommandParser implements Parser\u003cAddStaffCommand\u003e {","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" * Parses the given {@code String} of arguments in the context of the AddStaffCommand","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" public AddStaffCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG,","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" PREFIX_SALARY, PREFIX_EMPLOYMENT);","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL,","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" PREFIX_EMPLOYMENT, PREFIX_SALARY)","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddStaffCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" PREFIX_SALARY, PREFIX_EMPLOYMENT);","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Tag tag \u003d new Tag(\"staff\");","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" Employment employment \u003d ParserUtil.parseEmployment(argMultimap.getValue(PREFIX_EMPLOYMENT).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" Salary salary \u003d ParserUtil.parseSalary(argMultimap.getValue(PREFIX_SALARY).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" Staff person \u003d new Staff(name, phone, email, address, tags, salary, employment);","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" return new AddStaffCommand(person);","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":73}},{"path":"src/main/java/seedu/address/logic/parser/AddSupplierCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRICE;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRODUCT;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import java.util.HashSet;","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddSupplierCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Price;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Product;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" * Parses input arguments and creates a new AddStaffCommand object","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"public class AddSupplierCommandParser implements Parser\u003cAddSupplierCommand\u003e {","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * Parses the given {@code String} of arguments in the context of the AddStaffCommand","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" public AddSupplierCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" PREFIX_PRODUCT, PREFIX_PRICE);","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL,","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" PREFIX_PRODUCT, PREFIX_PRICE)","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddSupplierCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" PREFIX_PRODUCT, PREFIX_PRICE);","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" Tag tag \u003d new Tag(\"supplier\");","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" Price price \u003d ParserUtil.parsePrice(argMultimap.getValue(PREFIX_PRICE).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" Product product \u003d ParserUtil.parseProduct(argMultimap.getValue(PREFIX_PRODUCT).get());","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" Supplier person \u003d new Supplier(name, phone, email, address, tags, product, price);","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" return new AddSupplierCommand(person);","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":72}},{"path":"src/main/java/seedu/address/logic/parser/AddressBookParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2023-07-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddMaintainerCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddStaffCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddSupplierCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ClearCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.Command;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ExitCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.FindCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.HelpCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Parses user input.","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class AddressBookParser {","lastModifiedDate":"2017-07-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Used for initial separation of command word and args.","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final Pattern BASIC_COMMAND_FORMAT \u003d Pattern.compile(\"(?\u003ccommandWord\u003e\\\\S+)(?\u003carguments\u003e.*)\");","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AddressBookParser.class);","lastModifiedDate":"2023-07-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Parses user input into command for execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * @param userInput full user input string","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * @return the command based on the user input","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" final Matcher matcher \u003d BASIC_COMMAND_FORMAT.matcher(userInput.trim());","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (!matcher.matches()) {","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // Note to developers: Change the log level in config.json to enable lower level (i.e., FINE, FINER and lower)","lastModifiedDate":"2023-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // log messages such as the one below.","lastModifiedDate":"2023-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // Lower level log messages are used sparingly to minimize noise in the code.","lastModifiedDate":"2023-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" logger.fine(\"Command word: \" + commandWord + \"; Arguments: \" + arguments);","lastModifiedDate":"2023-07-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":" switch (commandWord) {","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" case AddCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new AddCommandParser().parse(arguments);","lastModifiedDate":"2017-02-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" case AddStaffCommand.COMMAND_WORD:","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" return new AddStaffCommandParser().parse(arguments);","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" case AddSupplierCommand.COMMAND_WORD:","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" return new AddSupplierCommandParser().parse(arguments);","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" case AddMaintainerCommand.COMMAND_WORD:","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" return new AddMaintainerCommandParser().parse(arguments);","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2016-12-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" case DeleteCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new DeleteCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" case ClearCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new ClearCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" case FindCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return new FindCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" case ListCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return new ListCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" case ExitCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return new ExitCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":89,"author":{"gitId":"-"},"content":" case HelpCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return new HelpCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" default:","lastModifiedDate":"2016-08-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" logger.finer(\"This user input caused a ParseException: \" + userInput);","lastModifiedDate":"2023-07-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-03-11"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"chiageng":12,"-":86}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"; name : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"; phone : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"; email : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"; address : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_EMPLOYMENT \u003d new Prefix(\"; employment : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_SALARY \u003d new Prefix(\"; salary : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_PRODUCT \u003d new Prefix(\"; product : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_PRICE \u003d new Prefix(\"; price : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_SKILL \u003d new Prefix(\"; skill : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" public static final Prefix PREFIX_COMMISSION \u003d new Prefix(\"; commission : \");","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"chiageng":11,"-":11}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Price;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Product;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":37,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":54,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":62,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":66,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":67,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":68,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":69,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":79,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":83,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" * Parses a {@code String employment} into an {@code Employment}.","lastModifiedDate":"2024-03-08"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-03-08"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the given {@code employment} is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" public static Employment parseEmployment(String employment) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" requireNonNull(employment);","lastModifiedDate":"2024-03-08"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" String trimmedEmployment \u003d employment.trim();","lastModifiedDate":"2024-03-08"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" if (!Employment.isValidEmployment(trimmedEmployment)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" throw new ParseException(Employment.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":" return new Employment(trimmedEmployment);","lastModifiedDate":"2024-03-08"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" * Parses a {@code String salary} into an {@code Salary}.","lastModifiedDate":"2024-03-08"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-03-08"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the given {@code salary} is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" public static Salary parseSalary(String salary) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" requireNonNull(salary);","lastModifiedDate":"2024-03-08"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" String trimmedSalary \u003d salary.trim();","lastModifiedDate":"2024-03-08"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":" if (!Salary.isValidSalary(trimmedSalary)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" throw new ParseException(Salary.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":130,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":131,"author":{"gitId":"chiageng"},"content":" return new Salary(trimmedSalary);","lastModifiedDate":"2024-03-08"},{"lineNumber":132,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" * Parses a {@code String product} into an {@code Product}.","lastModifiedDate":"2024-03-08"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-03-08"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the given {@code product} is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" public static Product parseProduct(String product) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":" requireNonNull(product);","lastModifiedDate":"2024-03-08"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":" String trimmedProduct \u003d product.trim();","lastModifiedDate":"2024-03-08"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":" if (!Product.isValidProduct(trimmedProduct)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" throw new ParseException(Product.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" return new Product(trimmedProduct);","lastModifiedDate":"2024-03-08"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":" * Parses a {@code String price} into an {@code Price}.","lastModifiedDate":"2024-03-08"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-03-08"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the given {@code price} is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" public static Price parsePrice(String price) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" requireNonNull(price);","lastModifiedDate":"2024-03-08"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":" String trimmedPrice \u003d price.trim();","lastModifiedDate":"2024-03-08"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":" if (!Price.isValidPrice(trimmedPrice)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" throw new ParseException(Price.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" return new Price(trimmedPrice);","lastModifiedDate":"2024-03-08"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" * Parses a {@code String price} into an {@code Skill}.","lastModifiedDate":"2024-03-08"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-03-08"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the given {@code skill} is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" public static Skill parseSkill(String skill) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" requireNonNull(skill);","lastModifiedDate":"2024-03-08"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" String trimmedSkill \u003d skill.trim();","lastModifiedDate":"2024-03-08"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":" if (!Skill.isValidSkill(trimmedSkill)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" throw new ParseException(Skill.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" return new Skill(trimmedSkill);","lastModifiedDate":"2024-03-08"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" * Parses a {@code String price} into an {@code Commission}.","lastModifiedDate":"2024-03-08"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-03-08"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" * @throws ParseException if the given {@code commission} is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" public static Commission parseCommission(String commission) throws ParseException {","lastModifiedDate":"2024-03-08"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":" requireNonNull(commission);","lastModifiedDate":"2024-03-08"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":" String trimmedCommission \u003d commission.trim();","lastModifiedDate":"2024-03-08"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":" if (!Commission.isValidCommission(trimmedCommission)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" throw new ParseException(Commission.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":" return new Commission(trimmedCommission);","lastModifiedDate":"2024-03-08"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":195,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":196,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":197,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":200,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":201,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":202,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":203,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":204,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":205,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":206,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":209,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":210,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":211,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":212,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":213,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":214,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":215,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":216,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":218,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":219,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":220,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"chiageng":96,"-":124}},{"path":"src/main/java/seedu/address/model/person/Commission.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Represents a Maitainer\u0027s commission in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidCommission(String)}","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"public class Commission {","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" \"Commision should in this format of ${amount}/hr\";","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" public static final String VALIDATION_REGEX \u003d \"^\\\\$\\\\d+/hr$\";","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" public final String commission;","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" * Constructs an {@code Commission}.","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" * @param commission A valid commission.","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public Commission(String commission) {","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" requireNonNull(commission);","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" checkArgument(isValidCommission(commission), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" this.commission \u003d commission;","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" * Returns true if a given string is a valid commission.","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" public static boolean isValidCommission(String test) {","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" return commission;","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Commission)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Commission otherCommission \u003d (Commission) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return commission.equals(otherCommission.commission);","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" return commission.hashCode();","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":58}},{"path":"src/main/java/seedu/address/model/person/Employment.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Represents a Staff\u0027s employment status in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmployment(String)} )}","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"public class Employment {","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" \"Employment should be either full-time or part-time\";","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" public static final String VALIDATION_REGEX1 \u003d \"part-time\";","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" public static final String VALIDATION_REGEX2 \u003d \"full-time\";","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":" public final String employment;","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" * Constructs an {@code Employment}.","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" * @param employment A valid employment either part-time or full-time.","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public Employment(String employment) {","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" requireNonNull(employment);","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" checkArgument(isValidEmployment(employment), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" this.employment \u003d employment;","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" * Returns true if a given string is a valid salary.","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" public static boolean isValidEmployment(String test) {","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" return test.matches(VALIDATION_REGEX1) || test.matches(VALIDATION_REGEX2);","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" return employment;","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Employment)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" Employment otherEmployment \u003d (Employment) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" return employment.equals(otherEmployment.employment);","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" return employment.hashCode();","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":59}},{"path":"src/main/java/seedu/address/model/person/Maintainer.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import java.util.Objects;","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" * Represents a Maintainer in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"public class Maintainer extends Person {","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" // Data fields","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" private final Skill skill;","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" private final Commission commission;","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * Every field must be present and not null.","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public Maintainer(Name name, Phone phone, Email email, Address address, Set\u003cTag\u003e tags,","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" Skill skill, Commission commission) {","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" super(name, phone, email, address, tags);","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" requireAllNonNull(skill, commission);","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" this.skill \u003d skill;","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" this.commission \u003d commission;","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" public Skill getSkill() {","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" return skill;","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" public Commission getCommission() {","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" return commission;","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" * Returns true if both Maintainer have the same identity and data fields.","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" * This defines a stronger notion of equality between two maintainer.","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Maintainer)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Maintainer otherPerson \u003d (Maintainer) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" return super.equals(otherPerson)","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" \u0026\u0026 skill.equals(otherPerson.skill)","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" \u0026\u0026 commission.equals(otherPerson.commission);","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" return Objects.hash(super.hashCode(), skill, commission);","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" .add(\"name\", getName())","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" .add(\"phone\", getPhone())","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" .add(\"email\", getEmail())","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" .add(\"address\", getAddress())","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" .add(\"tags\", getTags())","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" .add(\"skill\", skill)","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" .add(\"commission\", commission)","lastModifiedDate":"2024-03-08"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" .toString();","lastModifiedDate":"2024-03-08"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":78}},{"path":"src/main/java/seedu/address/model/person/Name.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2017-05-30"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s name in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Name {","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2018-04-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public final String fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Constructs a {@code Name}.","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * @param name A valid name.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public Name(String name) {","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" checkArgument(isValidName(name), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" fullName \u003d name;","lastModifiedDate":"2018-08-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid name.","lastModifiedDate":"2018-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static boolean isValidName(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (!(other instanceof Name)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Name otherName \u003d (Name) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" return fullName.toLowerCase().equals(otherName.fullName.toLowerCase());","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return fullName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"chiageng":1,"-":66}},{"path":"src/main/java/seedu/address/model/person/Person.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public Person(Name name, Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2017-05-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" * Name is case-insensitive, Janna and janna is same name.","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"chiageng":1,"-":117}},{"path":"src/main/java/seedu/address/model/person/Price.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Represents a Supplier\u0027s product price in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidPrice(String)}","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"public class Price {","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" \"Salary should in this format of ${amount}/h\";","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" public static final String VALIDATION_REGEX \u003d \"^\\\\$\\\\d+/.+$\";","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" public final String price;","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" * Constructs an {@code Product}.","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" * @param price A valid price.","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public Price(String price) {","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" requireNonNull(price);","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" checkArgument(isValidPrice(price), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" this.price \u003d price;","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" * Returns true if a given string is a valid salary.","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" public static boolean isValidPrice(String test) {","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" return price;","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Price)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Price otherPrice \u003d (Price) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return price.equals(otherPrice.price);","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" return price.hashCode();","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":58}},{"path":"src/main/java/seedu/address/model/person/Product.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Represents a Supplier\u0027s product in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidProduct(String)}","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"public class Product {","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Product can take any values, and it should not be blank\";","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" * The first character of the product must not be a whitespace,","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" public final String product;","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * Constructs an {@code Product}.","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" * @param product A valid product.","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" public Product(String product) {","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" requireNonNull(product);","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" checkArgument(isValidProduct(product), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" this.product \u003d product;","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * Returns true if a given string is a valid product.","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" public static boolean isValidProduct(String test) {","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" return product;","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Product)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Product otherProduct \u003d (Product) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" return product.equals(otherProduct.product);","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" return product.hashCode();","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":62}},{"path":"src/main/java/seedu/address/model/person/Salary.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Represents a Staff\u0027s salary in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidSalary(String)}","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"public class Salary {","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" \"Salary should in this format of ${amount}/hr\";","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" public static final String VALIDATION_REGEX \u003d \"^\\\\$\\\\d+/hr$\";","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" public final String value;","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" * Constructs an {@code Salary}.","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" * @param value A valid salary value.","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public Salary(String value) {","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" requireNonNull(value);","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" checkArgument(isValidSalary(value), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" this.value \u003d value;","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" * Returns true if a given string is a valid salary.","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" public static boolean isValidSalary(String test) {","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" return value;","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Salary)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Salary otherSalary \u003d (Salary) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return value.equals(otherSalary.value);","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":58}},{"path":"src/main/java/seedu/address/model/person/Skill.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Represents a Supplier\u0027s product in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidSkill(String)}","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"public class Skill {","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Skill can take any values, and it should not be blank\";","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" * The first character of the skill must not be a whitespace,","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" public final String skill;","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * Constructs an {@code Skill}.","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" * @param skill A valid skill.","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" public Skill(String skill) {","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" requireNonNull(skill);","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" checkArgument(isValidSkill(skill), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" this.skill \u003d skill;","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * Returns true if a given string is a valid product.","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" public static boolean isValidSkill(String test) {","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" return skill;","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Skill)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Skill otherSkill \u003d (Skill) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" return skill.equals(otherSkill.skill);","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" return skill.hashCode();","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":62}},{"path":"src/main/java/seedu/address/model/person/Staff.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import java.util.Objects;","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" * Represents a Staff in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"public class Staff extends Person {","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" // Data fields","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" private final Salary salary;","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" private final Employment employment;","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * Every field must be present and not null.","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public Staff(Name name, Phone phone, Email email, Address address, Set\u003cTag\u003e tags,","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" Salary salary, Employment employment) {","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" super(name, phone, email, address, tags);","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" requireAllNonNull(salary, employment);","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" this.salary \u003d salary;","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" this.employment \u003d employment;","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" public Salary getSalary() {","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" return salary;","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" public Employment getEmployment() {","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" return employment;","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" * Returns true if both staffs have the same identity and data fields.","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" * This defines a stronger notion of equality between two staff.","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Staff)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Staff otherPerson \u003d (Staff) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" return super.equals(otherPerson)","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" \u0026\u0026 salary.equals(otherPerson.salary)","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" \u0026\u0026 employment.equals(otherPerson.employment);","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" return Objects.hash(super.hashCode(), salary, employment);","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" .add(\"name\", getName())","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" .add(\"phone\", getPhone())","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" .add(\"email\", getEmail())","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" .add(\"address\", getAddress())","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" .add(\"tags\", getTags())","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" .add(\"salary\", salary)","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" .add(\"employment\", employment)","lastModifiedDate":"2024-03-08"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" .toString();","lastModifiedDate":"2024-03-08"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":78}},{"path":"src/main/java/seedu/address/model/person/Supplier.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import java.util.Objects;","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" * Represents a Supplier in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"public class Supplier extends Person {","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" // Data fields","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" private final Product product;","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" private final Price price;","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * Every field must be present and not null.","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public Supplier(Name name, Phone phone, Email email, Address address, Set\u003cTag\u003e tags,","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" Product product, Price price) {","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" super(name, phone, email, address, tags);","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" requireAllNonNull(product, price);","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" this.product \u003d product;","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" this.price \u003d price;","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" public Price getPrice() {","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" return price;","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" public Product getProduct() {","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" return product;","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" * Returns true if both staffs have the same identity and data fields.","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" * This defines a stronger notion of equality between two staff.","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" return true;","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" if (!(other instanceof Supplier)) {","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return false;","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Supplier otherPerson \u003d (Supplier) other;","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" return super.equals(otherPerson)","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" \u0026\u0026 product.equals(otherPerson.product)","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" \u0026\u0026 price.equals(otherPerson.price);","lastModifiedDate":"2024-03-08"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-08"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" return Objects.hash(super.hashCode(), product, price);","lastModifiedDate":"2024-03-08"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" public String toString() {","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" .add(\"name\", getName())","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" .add(\"phone\", getPhone())","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" .add(\"email\", getEmail())","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" .add(\"address\", getAddress())","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" .add(\"tags\", getTags())","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" .add(\"product\", product)","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" .add(\"price\", price)","lastModifiedDate":"2024-03-08"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" .toString();","lastModifiedDate":"2024-03-08"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-08"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"chiageng":78}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-20"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"chiageng":2,"-":56}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedMaintainer.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.storage;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"class JsonAdaptedMaintainer extends JsonAdaptedPerson {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" private final String skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" private final String commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" public JsonAdaptedMaintainer(Person source) {","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" super(source);","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" Maintainer supplier \u003d (Maintainer) source;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" skill \u003d supplier.getSkill().skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" commission \u003d supplier.getCommission().commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":25}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Price;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Product;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" private String employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" private String salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" private String product;","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" private String price;","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" private String skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" private String commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags,","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" @JsonProperty(\"salary\") String salary,","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" @JsonProperty(\"employment\") String employment,","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" @JsonProperty(\"product\") String product,","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @JsonProperty(\"price\") String price,","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" @JsonProperty(\"skill\") String skill,","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" @JsonProperty(\"commission\") String commission) {","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" this.salary \u003d salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" this.employment \u003d employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" this.product \u003d product;","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" this.price \u003d price;","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" this.skill \u003d skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" this.commission \u003d commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":" if (salary !\u003d null \u0026\u0026 employment !\u003d null) {","lastModifiedDate":"2024-03-09"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" if (!Salary.isValidSalary(salary)) {","lastModifiedDate":"2024-03-09"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":" throw new IllegalValueException(Salary.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" if (!Employment.isValidEmployment(employment)) {","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":" throw new IllegalValueException(Employment.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":" final Salary modelSalary \u003d new Salary(salary);","lastModifiedDate":"2024-03-09"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":" final Employment modelEmployment \u003d new Employment(employment);","lastModifiedDate":"2024-03-09"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":" return new Staff(modelName, modelPhone, modelEmail, modelAddress, modelTags, modelSalary, modelEmployment);","lastModifiedDate":"2024-03-09"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" if (product !\u003d null \u0026\u0026 price !\u003d null) {","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":" if (!Product.isValidProduct(product)) {","lastModifiedDate":"2024-03-09"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":" throw new IllegalValueException(Product.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":" if (!Price.isValidPrice(price)) {","lastModifiedDate":"2024-03-09"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" throw new IllegalValueException(Price.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":" final Product modelProduct \u003d new Product(product);","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" final Price modelPrice \u003d new Price(price);","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" return new Supplier(modelName, modelPhone, modelEmail, modelAddress, modelTags,","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" modelProduct, modelPrice);","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" if (skill !\u003d null \u0026\u0026 commission !\u003d null) {","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" if (!Skill.isValidSkill(skill)) {","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" throw new IllegalValueException(Skill.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":" if (!Commission.isValidCommission(commission)) {","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" throw new IllegalValueException(Commission.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" final Skill modelSkill \u003d new Skill(skill);","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" final Commission modelCommission \u003d new Commission(commission);","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":" return new Maintainer(modelName, modelPhone, modelEmail, modelAddress, modelTags,","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" modelSkill, modelCommission);","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"-"},"content":" return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"chiageng":67,"-":108}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedStaff.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.storage;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"class JsonAdaptedStaff extends JsonAdaptedPerson {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" private final String salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" private final String employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" public JsonAdaptedStaff(Person source) {","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" super(source);","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" Staff staff \u003d (Staff) source;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" salary \u003d staff.getSalary().value;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" employment \u003d staff.getEmployment().employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":25}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedSupplier.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.storage;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"class JsonAdaptedSupplier extends JsonAdaptedPerson {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" private final String product;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" private final String price;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" public JsonAdaptedSupplier(Person source) {","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" super(source);","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" Supplier supplier \u003d (Supplier) source;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" product \u003d supplier.getProduct().product;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" price \u003d supplier.getPrice().price;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":25}},{"path":"src/main/java/seedu/address/storage/JsonSerializableAddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonRootName;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * An Immutable AddressBook that is serializable to JSON format.","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"@JsonRootName(value \u003d \"addressbook\")","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"class JsonSerializableAddressBook {","lastModifiedDate":"2018-12-03"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"Persons list contains duplicate person(s).\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedPerson\u003e persons \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonSerializableAddressBook} with the given persons.","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(@JsonProperty(\"persons\") List\u003cJsonAdaptedPerson\u003e persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.persons.addAll(persons);","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created {@code JsonSerializableAddressBook}.","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" persons.addAll(source.getPersonList()","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" .stream()","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" .map(person -\u003e {","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" if (person instanceof Staff) {","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" return new JsonAdaptedStaff(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" } else if (person instanceof Maintainer) {","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" return new JsonAdaptedMaintainer(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" } else if (person instanceof Supplier) {","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" return new JsonAdaptedSupplier(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" } else {","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" return new JsonAdaptedPerson(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" })","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Converts this address book into the model\u0027s {@code AddressBook} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated.","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public AddressBook toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" for (JsonAdaptedPerson jsonAdaptedPerson : persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" Person person \u003d jsonAdaptedPerson.toModelType();","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (addressBook.hasPerson(person)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"chiageng":18,"-":59}},{"path":"src/main/java/seedu/address/ui/PersonCard.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.ui;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Comparator;","lastModifiedDate":"2019-01-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-01-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.FlowPane;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2016-09-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @see \u003ca href\u003d\"https://github.com/se-edu/addressbook-level4/issues/336\"\u003eThe issue on AddressBook level 4\u003c/a\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" private Label salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" @FXML","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" private Label employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" @FXML","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" private Label product;","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" @FXML","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" private Label price;","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" @FXML","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" private Label skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" @FXML","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" private Label commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" @FXML","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" private Label className;","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @FXML","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":65,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":68,"author":{"gitId":"-"},"content":" name.setText(person.getName().fullName);","lastModifiedDate":"2017-12-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" phone.setText(person.getPhone().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" address.setText(person.getAddress().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":71,"author":{"gitId":"-"},"content":" email.setText(person.getEmail().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":73,"author":{"gitId":"-"},"content":" .sorted(Comparator.comparing(tag -\u003e tag.tagName))","lastModifiedDate":"2019-01-02"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.tagName)));","lastModifiedDate":"2019-01-02"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" if (person instanceof Staff) {","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" Staff staff \u003d (Staff) person;","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" salary.setText(staff.getSalary().value);","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" employment.setText(staff.getEmployment().employment);","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" salary.setManaged(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" employment.setManaged(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" salary.setVisible(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" employment.setVisible(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" } else if (person instanceof Supplier) {","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" Supplier supplier \u003d (Supplier) person;","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" product.setText(supplier.getProduct().product);","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" price.setText(supplier.getPrice().price);","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" product.setManaged(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" price.setManaged(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" product.setVisible(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" price.setVisible(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" } else if (person instanceof Maintainer) {","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" Maintainer maintainer \u003d (Maintainer) person;","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" skill.setText(maintainer.getSkill().skill);","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" commission.setText(maintainer.getCommission().commission);","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" skill.setManaged(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" commission.setManaged(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" skill.setVisible(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" commission.setVisible(true);","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" public Label getSalary() {","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" return salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" public Label getEmployment() {","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" return employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"chiageng":49,"-":60}},{"path":"src/main/resources/view/PersonListCard.fxml","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cHBox id\u003d\"cardPane\" fx:id\u003d\"cardPane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2023-07-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cpadding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2017-03-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003c/padding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/Label\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2016-09-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cFlowPane fx:id\u003d\"tags\" /\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" \u003cLabel fx:id\u003d\"salary\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$salary\" managed\u003d\"false\"/\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" \u003cLabel fx:id\u003d\"employment\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$employment\" managed\u003d\"false\"/\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" \u003cLabel fx:id\u003d\"product\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$product\" managed\u003d\"false\"/\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" \u003cLabel fx:id\u003d\"price\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$price\" managed\u003d\"false\"/\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" \u003cLabel fx:id\u003d\"skill\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$skill\" managed\u003d\"false\"/\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" \u003cLabel fx:id\u003d\"commission\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$commission\" managed\u003d\"false\"/\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"chiageng":6,"-":36}},{"path":"src/test/java/seedu/address/logic/commands/AddMaintainerCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.ALICEMAINTAINER;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import java.nio.file.Path;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import java.util.ArrayList;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import java.util.Arrays;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.MaintainerBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"public class AddMaintainerCommandTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new AddMaintainerCommand(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" Maintainer validPerson \u003d new MaintainerBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" CommandResult commandResult \u003d new AddMaintainerCommand(validPerson).execute(modelStub);","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" assertEquals(String.format(AddMaintainerCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Maintainer validPerson \u003d new MaintainerBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand addCommand \u003d new AddMaintainerCommand(validPerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" assertThrows(CommandException.class,","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" Maintainer alice \u003d new MaintainerBuilder().withName(\"Alice\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" Maintainer bob \u003d new MaintainerBuilder().withName(\"Bob\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand addAliceCommand \u003d new AddMaintainerCommand(alice);","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand addBobCommand \u003d new AddMaintainerCommand(bob);","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand addAliceCommandCopy \u003d new AddMaintainerCommand(alice);","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand addCommand \u003d new AddMaintainerCommand(ALICEMAINTAINER);","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" String expected \u003d AddMaintainerCommand.class.getCanonicalName()","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" + \"{toAdd\u003d\" + ALICEMAINTAINER + \"}\";","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":130,"author":{"gitId":"chiageng"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2024-03-09"},{"lineNumber":131,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":132,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2024-03-09"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2024-03-09"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" private final Person person;","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":" this.person \u003d person;","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":" personsAdded.add(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":" return new AddressBook();","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":206,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":207,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":207}},{"path":"src/test/java/seedu/address/logic/commands/AddStaffCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.ALICESTAFF;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import java.nio.file.Path;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import java.util.ArrayList;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import java.util.Arrays;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.StaffBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"public class AddStaffCommandTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new AddStaffCommand(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" Staff validPerson \u003d new StaffBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" CommandResult commandResult \u003d new AddStaffCommand(validPerson).execute(modelStub);","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" assertEquals(String.format(AddStaffCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Staff validPerson \u003d new StaffBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" AddStaffCommand addCommand \u003d new AddStaffCommand(validPerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" assertThrows(CommandException.class,","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" AddStaffCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" Staff alice \u003d new StaffBuilder().withName(\"Alice\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" Staff bob \u003d new StaffBuilder().withName(\"Bob\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" AddStaffCommand addAliceCommand \u003d new AddStaffCommand(alice);","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" AddStaffCommand addBobCommand \u003d new AddStaffCommand(bob);","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" AddStaffCommand addAliceCommandCopy \u003d new AddStaffCommand(alice);","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" AddStaffCommand addCommand \u003d new AddStaffCommand(ALICESTAFF);","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" String expected \u003d AddStaffCommand.class.getCanonicalName() + \"{toAdd\u003d\" + ALICESTAFF + \"}\";","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2024-03-09"},{"lineNumber":130,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":131,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":132,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2024-03-09"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2024-03-09"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2024-03-09"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":" private final Person person;","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" this.person \u003d person;","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" personsAdded.add(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" return new AddressBook();","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":206,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":206}},{"path":"src/test/java/seedu/address/logic/commands/AddSupplierCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.ALICESUPPLIER;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import java.nio.file.Path;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import java.util.ArrayList;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import java.util.Arrays;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.SupplierBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"public class AddSupplierCommandTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new AddSupplierCommand(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" Supplier validPerson \u003d new SupplierBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" CommandResult commandResult \u003d new AddSupplierCommand(validPerson).execute(modelStub);","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" assertEquals(String.format(AddSupplierCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" Supplier validPerson \u003d new SupplierBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand addCommand \u003d new AddSupplierCommand(validPerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" assertThrows(CommandException.class,","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" Supplier alice \u003d new SupplierBuilder().withName(\"Alice\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" Supplier bob \u003d new SupplierBuilder().withName(\"Bob\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand addAliceCommand \u003d new AddSupplierCommand(alice);","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand addBobCommand \u003d new AddSupplierCommand(bob);","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand addAliceCommandCopy \u003d new AddSupplierCommand(alice);","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand addCommand \u003d new AddSupplierCommand(ALICESUPPLIER);","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" String expected \u003d AddSupplierCommand.class.getCanonicalName() + \"{toAdd\u003d\" + ALICESUPPLIER + \"}\";","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2024-03-09"},{"lineNumber":130,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":131,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":132,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2024-03-09"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2024-03-09"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2024-03-09"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":" private final Person person;","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" this.person \u003d person;","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":" requireNonNull(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" personsAdded.add(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":" @Override","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" return new AddressBook();","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":206,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":206}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_COMMISSION;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMPLOYMENT;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRICE;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRODUCT;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SKILL;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public static final String VALID_PRODUCT_AMY \u003d \"pooch food\";","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" public static final String VALID_PRICE_AMY \u003d \"$50/bag\";","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" public static final String VALID_SKILL_AMY \u003d \"trian dog\";","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" public static final String VALID_COMMISSION_AMY \u003d \"$50/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" public static final String VALID_SALARY_AMY \u003d \"$50/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" public static final String VALID_EMPLOYMENT_AMY \u003d \"part-time\";","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" public static final String VALID_PRODUCT_BOB \u003d \"pooch food\";","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" public static final String VALID_PRICE_BOB \u003d \"$50/bag\";","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" public static final String VALID_SKILL_BOB \u003d \"trian dog\";","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" public static final String VALID_COMMISSION_BOB \u003d \"$50/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" public static final String VALID_SALARY_BOB \u003d \"$50/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" public static final String VALID_EMPLOYMENT_BOB \u003d \"part-time\";","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" public static final String VALID_TAG \u003d \"other\";","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" public static final String SALARY_DESC_AMY \u003d \" \" + PREFIX_SALARY + VALID_SALARY_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" public static final String EMPLOYMENT_DESC_AMY \u003d \" \" + PREFIX_EMPLOYMENT + VALID_EMPLOYMENT_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" public static final String PRODUCT_DESC_AMY \u003d \" \" + PREFIX_PRODUCT + VALID_PRODUCT_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" public static final String PRICE_DESC_AMY \u003d \" \" + PREFIX_PRICE + VALID_PRICE_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" public static final String SKILL_DESC_AMY \u003d \" \" + PREFIX_SKILL + VALID_SKILL_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" public static final String COMMISSION_DESC_AMY \u003d \" \" + PREFIX_COMMISSION + VALID_COMMISSION_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" public static final String SALARY_DESC_BOB \u003d \" \" + PREFIX_SALARY + VALID_SALARY_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" public static final String EMPLOYMENT_DESC_BOB \u003d \" \" + PREFIX_EMPLOYMENT + VALID_EMPLOYMENT_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" public static final String PRODUCT_DESC_BOB \u003d \" \" + PREFIX_PRODUCT + VALID_PRODUCT_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" public static final String PRICE_DESC_BOB \u003d \" \" + PREFIX_PRICE + VALID_PRICE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" public static final String SKILL_DESC_BOB \u003d \" \" + PREFIX_SKILL + VALID_SKILL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" public static final String COMMISSION_DESC_BOB \u003d \" \" + PREFIX_COMMISSION + VALID_COMMISSION_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public static final String INVALID_NAME_DESC \u003d \" \" + PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2017-07-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \" + PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2017-07-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-07-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2017-07-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public static final String INVALID_TAG_DESC \u003d \" \" + PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2017-07-05"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" public static final String INVALID_SALARY_DESC \u003d \" \" + PREFIX_SALARY + \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" public static final String INVALID_EMPLOYMENT_DESC \u003d \" \" + PREFIX_EMPLOYMENT + \"employment\";","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" public static final String INVALID_PRODUCT_DESC \u003d \" \" + PREFIX_PRODUCT;","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" public static final String INVALID_PRICE_DESC \u003d \" \" + PREFIX_PRICE + \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" public static final String INVALID_SKILL_DESC \u003d \" \" + PREFIX_SKILL;","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" public static final String INVALID_COMMISSION_DESC \u003d \" \" + PREFIX_COMMISSION + \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":109,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":111,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":112,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":115,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":116,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":125,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":126,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":127,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":129,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":134,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":141,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":142,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":143,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":144,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":150,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":152,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":153,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":155,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":157,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":158,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":159,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":161,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":164,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"chiageng":37,"-":127}},{"path":"src/test/java/seedu/address/logic/commands/EditCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for EditCommand.","lastModifiedDate":"2020-12-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"public class EditCommandTest {","lastModifiedDate":"2017-05-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void execute_allFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(editedPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_someFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Index indexLastPerson \u003d Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Person lastPerson \u003d model.getFilteredPersonList().get(indexLastPerson.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" PersonBuilder personInList \u003d new PersonBuilder(lastPerson);","lastModifiedDate":"2017-05-18"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person editedPerson \u003d personInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" .withTags(VALID_TAG).build();","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG).build();","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(indexLastPerson, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":65,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":68,"author":{"gitId":"-"},"content":" expectedModel.setPerson(lastPerson, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void execute_noFieldSpecifiedUnfilteredList_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":75,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON, new EditPersonDescriptor());","lastModifiedDate":"2018-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Person editedPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void execute_filteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Person personInFilteredList \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder(personInFilteredList).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2018-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Person firstPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(firstPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_SECOND_PERSON, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-01-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":113,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // edit person in filtered list into a duplicate in address book","lastModifiedDate":"2017-05-18"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":117,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2018-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder(personInList).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-01-25"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":125,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-05-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-18"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Edit filtered list where index is larger than size of filtered list,","lastModifiedDate":"2017-05-18"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * but smaller than size of address book","lastModifiedDate":"2017-05-18"},{"lineNumber":135,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-18"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":138,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-18"},{"lineNumber":140,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-05-18"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":143,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex,","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":151,"author":{"gitId":"-"},"content":" final EditCommand standardCommand \u003d new EditCommand(INDEX_FIRST_PERSON, DESC_AMY);","lastModifiedDate":"2018-08-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":" EditPersonDescriptor copyDescriptor \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-08"},{"lineNumber":155,"author":{"gitId":"-"},"content":" EditCommand commandWithSameValues \u003d new EditCommand(INDEX_FIRST_PERSON, copyDescriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(commandWithSameValues));","lastModifiedDate":"2017-05-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":159,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(standardCommand));","lastModifiedDate":"2017-05-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(null));","lastModifiedDate":"2017-05-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new ClearCommand()));","lastModifiedDate":"2017-05-08"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":168,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new EditCommand(INDEX_SECOND_PERSON, DESC_AMY)));","lastModifiedDate":"2017-05-25"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":" // different descriptor -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new EditCommand(INDEX_FIRST_PERSON, DESC_BOB)));","lastModifiedDate":"2017-05-25"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2019-02-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" String expected \u003d EditCommand.class.getCanonicalName() + \"{index\u003d\" + index + \", editPersonDescriptor\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" + editPersonDescriptor + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertEquals(expected, editCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-08"}],"authorContributionMap":{"chiageng":3,"-":181}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2017-12-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-06-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2017-06-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB, new AddCommand(expectedPerson));","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2023-07-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;","lastModifiedDate":"2023-07-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":109,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":129,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,","lastModifiedDate":"2017-12-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":135,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":136,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":138,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":142,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":154,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":155,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":161,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":169,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":173,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" invalid tag","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":183,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":184,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC,","lastModifiedDate":"2017-12-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":192,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"chiageng":18,"-":174}},{"path":"src/test/java/seedu/address/logic/parser/AddMaintainerCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.COMMISSION_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.COMMISSION_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_COMMISSION_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_SKILL_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.SKILL_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.SKILL_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_COMMISSION_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_SKILL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_COMMISSION;","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SKILL;","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BOBMAINTAINER;","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddMaintainerCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.MaintainerBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"public class AddMaintainerCommandParserTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" private AddMaintainerCommandParser parser \u003d new AddMaintainerCommandParser();","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" Maintainer expectedPerson \u003d new MaintainerBuilder(BOBMAINTAINER).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" // whitespace only preamble","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + SKILL_DESC_BOB + COMMISSION_DESC_BOB, new AddMaintainerCommand(expectedPerson));","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + SKILL_DESC_BOB + COMMISSION_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" // multiple names","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" // multiple phones","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" // multiple emails","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" // multiple addresses","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" // multiple fields repeated","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser,","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_AMY + SKILL_DESC_AMY + COMMISSION_DESC_AMY","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE,","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" PREFIX_SKILL, PREFIX_COMMISSION));","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" // invalid value followed by valid value","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" // valid value followed by invalid value","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":130,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":131,"author":{"gitId":"chiageng"},"content":" // invalid skill","lastModifiedDate":"2024-03-09"},{"lineNumber":132,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_SKILL_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_SKILL));","lastModifiedDate":"2024-03-09"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" // invalid commission","lastModifiedDate":"2024-03-09"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_COMMISSION_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_COMMISSION));","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddMaintainerCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-03-09"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" // missing name prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" // missing phone prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" // missing email prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" // missing address prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" // missing skill prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" + VALID_SKILL_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" // missing commission prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + VALID_COMMISSION_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" // all prefixes missing","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" + VALID_SKILL_BOB + VALID_COMMISSION_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":" Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":" Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" // invalid skill","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":" + INVALID_SKILL_DESC + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":" Skill.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":206,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":207,"author":{"gitId":"chiageng"},"content":" // invalid commission","lastModifiedDate":"2024-03-09"},{"lineNumber":208,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":209,"author":{"gitId":"chiageng"},"content":" + SKILL_DESC_BOB + INVALID_COMMISSION_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":210,"author":{"gitId":"chiageng"},"content":" Commission.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":211,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":212,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":213,"author":{"gitId":"chiageng"},"content":" invalid tag","lastModifiedDate":"2024-03-09"},{"lineNumber":214,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":215,"author":{"gitId":"chiageng"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":216,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":217,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":218,"author":{"gitId":"chiageng"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2024-03-09"},{"lineNumber":219,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-09"},{"lineNumber":220,"author":{"gitId":"chiageng"},"content":" + INVALID_SKILL_DESC + INVALID_COMMISSION_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":221,"author":{"gitId":"chiageng"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":222,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":223,"author":{"gitId":"chiageng"},"content":" // non-empty preamble","lastModifiedDate":"2024-03-09"},{"lineNumber":224,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":225,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + SKILL_DESC_BOB + COMMISSION_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":226,"author":{"gitId":"chiageng"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddMaintainerCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-09"},{"lineNumber":227,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":228,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":228}},{"path":"src/test/java/seedu/address/logic/parser/AddStaffCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMPLOYMENT_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMPLOYMENT_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMPLOYMENT_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_SALARY_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.SALARY_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.SALARY_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMPLOYMENT_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_SALARY_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMPLOYMENT;","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BOBSTAFF;","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddStaffCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.StaffBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":"public class AddStaffCommandParserTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" private AddStaffCommandParser parser \u003d new AddStaffCommandParser();","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" Staff expectedPerson \u003d new StaffBuilder(BOBSTAFF).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" // whitespace only preamble","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB, new AddStaffCommand(expectedPerson));","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" // multiple names","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" // multiple phones","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" // multiple emails","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" // multiple addresses","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" // multiple fields repeated","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser,","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_AMY + SALARY_DESC_AMY + EMPLOYMENT_DESC_AMY","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE,","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" PREFIX_SALARY, PREFIX_EMPLOYMENT));","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" // invalid value followed by valid value","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" // valid value followed by invalid value","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":130,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":131,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":132,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":" // invalid salary","lastModifiedDate":"2024-03-09"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_SALARY_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_SALARY));","lastModifiedDate":"2024-03-09"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":" // invalid employment","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMPLOYMENT_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMPLOYMENT));","lastModifiedDate":"2024-03-09"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddStaffCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-03-09"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" // missing name prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" // missing phone prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" // missing email prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" // missing address prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" // missing salary prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":" + VALID_SALARY_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" // missing employment prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + VALID_EMPLOYMENT_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" // all prefixes missing","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" + VALID_SALARY_BOB + VALID_EMPLOYMENT_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":" // invalid salary","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":206,"author":{"gitId":"chiageng"},"content":" + INVALID_SALARY_DESC + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":207,"author":{"gitId":"chiageng"},"content":" Salary.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":208,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":209,"author":{"gitId":"chiageng"},"content":" // invalid employment","lastModifiedDate":"2024-03-09"},{"lineNumber":210,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":211,"author":{"gitId":"chiageng"},"content":" + SALARY_DESC_BOB + INVALID_EMPLOYMENT_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":212,"author":{"gitId":"chiageng"},"content":" Employment.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":213,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":214,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":215,"author":{"gitId":"chiageng"},"content":" invalid tag","lastModifiedDate":"2024-03-09"},{"lineNumber":216,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":217,"author":{"gitId":"chiageng"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":218,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":219,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":220,"author":{"gitId":"chiageng"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2024-03-09"},{"lineNumber":221,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-09"},{"lineNumber":222,"author":{"gitId":"chiageng"},"content":" + INVALID_SALARY_DESC + INVALID_EMPLOYMENT_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":223,"author":{"gitId":"chiageng"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":224,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":225,"author":{"gitId":"chiageng"},"content":" // non-empty preamble","lastModifiedDate":"2024-03-09"},{"lineNumber":226,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":227,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + SALARY_DESC_BOB + EMPLOYMENT_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":228,"author":{"gitId":"chiageng"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddStaffCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-09"},{"lineNumber":229,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":230,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":230}},{"path":"src/test/java/seedu/address/logic/parser/AddSupplierCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PRICE_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PRODUCT_DESC;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PRICE_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PRICE_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PRODUCT_DESC_AMY;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PRODUCT_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PRICE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PRODUCT_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRICE;","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRODUCT;","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BOBSUPPLIER;","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddSupplierCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Price;","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Product;","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.SupplierBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"public class AddSupplierCommandParserTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" private AddSupplierCommandParser parser \u003d new AddSupplierCommandParser();","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" Supplier expectedPerson \u003d new SupplierBuilder(BOBSUPPLIER).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" // whitespace only preamble","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + PRODUCT_DESC_BOB + PRICE_DESC_BOB, new AddSupplierCommand(expectedPerson));","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + PRODUCT_DESC_BOB + PRICE_DESC_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" // multiple names","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" // multiple phones","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" // multiple emails","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" // multiple addresses","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" // multiple fields repeated","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser,","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_AMY + PRODUCT_DESC_AMY + PRICE_DESC_AMY","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE,","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" PREFIX_PRODUCT, PREFIX_PRICE));","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" // invalid value followed by valid value","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" // valid value followed by invalid value","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2024-03-09"},{"lineNumber":130,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":131,"author":{"gitId":"chiageng"},"content":" // invalid product","lastModifiedDate":"2024-03-09"},{"lineNumber":132,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PRODUCT_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":133,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PRODUCT));","lastModifiedDate":"2024-03-09"},{"lineNumber":134,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":135,"author":{"gitId":"chiageng"},"content":" // invalid price","lastModifiedDate":"2024-03-09"},{"lineNumber":136,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PRICE_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PRICE));","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":140,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":141,"author":{"gitId":"chiageng"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":142,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddSupplierCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-03-09"},{"lineNumber":143,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":144,"author":{"gitId":"chiageng"},"content":" // missing name prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":148,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":149,"author":{"gitId":"chiageng"},"content":" // missing phone prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":150,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" // missing email prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":" // missing address prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" // missing product prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" + VALID_PRODUCT_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" // missing price prefix","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + VALID_PRICE_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" // all prefixes missing","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" + VALID_PRODUCT_BOB + VALID_PRICE_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" // invalid name","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":" // invalid phone","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" // invalid email","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":" Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" // invalid address","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":" Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" // invalid product","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":" + INVALID_PRODUCT_DESC + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":" Product.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":206,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":207,"author":{"gitId":"chiageng"},"content":" // invalid employment","lastModifiedDate":"2024-03-09"},{"lineNumber":208,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":209,"author":{"gitId":"chiageng"},"content":" + PRODUCT_DESC_BOB + INVALID_PRICE_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":210,"author":{"gitId":"chiageng"},"content":" Price.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":211,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":212,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":213,"author":{"gitId":"chiageng"},"content":" invalid tag","lastModifiedDate":"2024-03-09"},{"lineNumber":214,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":215,"author":{"gitId":"chiageng"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":216,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":217,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":218,"author":{"gitId":"chiageng"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2024-03-09"},{"lineNumber":219,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-09"},{"lineNumber":220,"author":{"gitId":"chiageng"},"content":" + INVALID_PRODUCT_DESC + INVALID_PRICE_DESC,","lastModifiedDate":"2024-03-09"},{"lineNumber":221,"author":{"gitId":"chiageng"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-09"},{"lineNumber":222,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":223,"author":{"gitId":"chiageng"},"content":" // non-empty preamble","lastModifiedDate":"2024-03-09"},{"lineNumber":224,"author":{"gitId":"chiageng"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-03-09"},{"lineNumber":225,"author":{"gitId":"chiageng"},"content":" + ADDRESS_DESC_BOB + PRODUCT_DESC_BOB + PRICE_DESC_BOB,","lastModifiedDate":"2024-03-09"},{"lineNumber":226,"author":{"gitId":"chiageng"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddSupplierCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-09"},{"lineNumber":227,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":228,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":228}},{"path":"src/test/java/seedu/address/logic/parser/AddressBookParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-06-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddMaintainerCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddStaffCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddSupplierCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ClearCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.DeleteCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ExitCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.FindCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.HelpCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-05-24"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-27"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-06-27"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.MaintainerBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonUtil;","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.StaffBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.SupplierBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"public class AddressBookParserTest {","lastModifiedDate":"2017-07-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private final AddressBookParser parser \u003d new AddressBookParser();","lastModifiedDate":"2017-07-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public void parseCommand_add() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" AddCommand command \u003d (AddCommand) parser.parseCommand(PersonUtil.getAddCommand(person));","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertEquals(new AddCommand(person), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" public void parseCommand_addStaff() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" Staff person \u003d new StaffBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" AddStaffCommand command \u003d (AddStaffCommand) parser.parseCommand(","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" PersonUtil.getAddStaffCommand(person));","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" assertEquals(new AddStaffCommand(person), command);","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" public void parseCommand_addSupplier() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" Supplier person \u003d new SupplierBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" AddSupplierCommand command \u003d (AddSupplierCommand) parser.parseCommand(","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" PersonUtil.getAddSupplierCommand(person));","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" assertEquals(new AddSupplierCommand(person), command);","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" public void parseCommand_addMaintainer() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" Maintainer person \u003d new MaintainerBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" AddMaintainerCommand command \u003d (AddMaintainerCommand) parser.parseCommand(","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" PersonUtil.getAddMaintainerCommand(person));","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" assertEquals(new AddMaintainerCommand(person), command);","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void parseCommand_clear() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD) instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD + \" 3\") instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void parseCommand_delete() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" DeleteCommand command \u003d (DeleteCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" DeleteCommand.COMMAND_WORD + \" \" + INDEX_FIRST_PERSON.getOneBased());","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertEquals(new DeleteCommand(INDEX_FIRST_PERSON), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":89,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public void parseCommand_edit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(person).build();","lastModifiedDate":"2017-06-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":" EditCommand command \u003d (EditCommand) parser.parseCommand(EditCommand.COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" + INDEX_FIRST_PERSON.getOneBased() + \" \" + PersonUtil.getEditPersonDescriptorDetails(descriptor));","lastModifiedDate":"2018-03-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertEquals(new EditCommand(INDEX_FIRST_PERSON, descriptor), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void parseCommand_exit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD) instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD + \" 3\") instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void parseCommand_find() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":106,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d Arrays.asList(\"foo\", \"bar\", \"baz\");","lastModifiedDate":"2017-06-12"},{"lineNumber":107,"author":{"gitId":"-"},"content":" FindCommand command \u003d (FindCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":108,"author":{"gitId":"-"},"content":" FindCommand.COMMAND_WORD + \" \" + keywords.stream().collect(Collectors.joining(\" \")));","lastModifiedDate":"2017-06-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(new FindCommand(new NameContainsKeywordsPredicate(keywords)), command);","lastModifiedDate":"2017-06-12"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public void parseCommand_help() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD) instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD + \" 3\") instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void parseCommand_list() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD) instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":121,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD + \" 3\") instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":124,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public void parseCommand_unrecognisedInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE), ()","lastModifiedDate":"2019-03-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" -\u003e parser.parseCommand(\"\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":130,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" public void parseCommand_unknownCommand_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_UNKNOWN_COMMAND, () -\u003e parser.parseCommand(\"unknownCommand\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"chiageng":33,"-":101}},{"path":"src/test/java/seedu/address/logic/parser/ParserUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.ParserUtil.MESSAGE_INVALID_INDEX;","lastModifiedDate":"2017-06-02"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-05-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-05-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-05-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-05-22"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-22"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-22"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Price;","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Product;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class ParserUtilTest {","lastModifiedDate":"2017-05-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2017-05-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2017-05-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2017-05-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_EMPLOYMENT \u003d \"invalid employment\";","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_SALARY \u003d \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_PRODUCT \u003d \" \";","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_PRICE \u003d \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_SKILL \u003d \" \";","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_COMMISSION \u003d \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d \"Rachel Walker\";","lastModifiedDate":"2017-05-22"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d \"123456\";","lastModifiedDate":"2017-05-22"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d \"123 Main Street #0505\";","lastModifiedDate":"2017-05-22"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d \"rachel@example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" private static final String VALID_EMPLOYMENT \u003d \"part-time\";","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" private static final String VALID_SALARY \u003d \"$20/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" private static final String VALID_PRODUCT \u003d \"pooch food\";","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" private static final String VALID_PRICE \u003d \"$20/bag\";","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" private static final String VALID_SKILL \u003d \"train dog\";","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" private static final String VALID_COMMISSION \u003d \"$20/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_1 \u003d \"friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_2 \u003d \"neighbour\";","lastModifiedDate":"2017-05-22"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final String WHITESPACE \u003d \" \\t\\r\\n\";","lastModifiedDate":"2017-05-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void parseIndex_invalidInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseIndex(\"10 a\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void parseIndex_outOfRangeInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_INVALID_INDEX, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" -\u003e ParserUtil.parseIndex(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2019-03-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void parseIndex_validInput_success() throws Exception {","lastModifiedDate":"2017-05-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // No whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\"1\"));","lastModifiedDate":"2017-05-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // Leading and trailing whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\" 1 \"));","lastModifiedDate":"2017-05-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void parseName_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseName((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void parseName_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseName(INVALID_NAME));","lastModifiedDate":"2019-03-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void parseName_validValueWithoutWhitespace_returnsName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(VALID_NAME));","lastModifiedDate":"2017-05-29"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String nameWithWhitespace \u003d WHITESPACE + VALID_NAME + WHITESPACE;","lastModifiedDate":"2017-05-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace));","lastModifiedDate":"2017-05-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":99,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public void parsePhone_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePhone((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void parsePhone_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePhone(INVALID_PHONE));","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-22"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE));","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":115,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" String phoneWithWhitespace \u003d WHITESPACE + VALID_PHONE + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public void parseAddress_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseAddress((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void parseAddress_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseAddress(INVALID_ADDRESS));","lastModifiedDate":"2019-03-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":134,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-22"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));","lastModifiedDate":"2017-05-30"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" String addressWithWhitespace \u003d WHITESPACE + VALID_ADDRESS + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-30"},{"lineNumber":142,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":145,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":146,"author":{"gitId":"-"},"content":" public void parseEmail_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmail((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":150,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":151,"author":{"gitId":"-"},"content":" public void parseEmail_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":152,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmail(INVALID_EMAIL));","lastModifiedDate":"2019-03-14"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":157,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-22"},{"lineNumber":158,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL));","lastModifiedDate":"2017-05-30"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":161,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":163,"author":{"gitId":"-"},"content":" String emailWithWhitespace \u003d WHITESPACE + VALID_EMAIL + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":164,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-30"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" public void parseEmployment_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmployment((String) null));","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" public void parseEmployment_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmployment(INVALID_EMPLOYMENT));","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" public void parseEmployment_validValueWithoutWhitespace_returnsEmployment() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" Employment expectedEmployment \u003d new Employment(VALID_EMPLOYMENT);","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedEmployment, ParserUtil.parseEmployment(VALID_EMPLOYMENT));","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" public void parseEmployment_validValueWithWhitespace_returnsTrimmedEmployment() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":" String employmentWithWhitespace \u003d WHITESPACE + VALID_EMPLOYMENT + WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":" Employment expectedEmployment \u003d new Employment(VALID_EMPLOYMENT);","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedEmployment, ParserUtil.parseEmployment(employmentWithWhitespace));","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" public void parseSalary_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseSalary((String) null));","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" public void parseSalary_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseSalary(INVALID_SALARY));","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" public void parseSalary_validValueWithoutWhitespace_returnsSalary() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":" Salary expectedSalary \u003d new Salary(VALID_SALARY);","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedSalary, ParserUtil.parseSalary(VALID_SALARY));","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":206,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":207,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":208,"author":{"gitId":"chiageng"},"content":" public void parseSalary_validValueWithWhitespace_returnsTrimmedSalary() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":209,"author":{"gitId":"chiageng"},"content":" String salaryWithWhitespace \u003d WHITESPACE + VALID_SALARY + WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":210,"author":{"gitId":"chiageng"},"content":" Salary expectedSalary \u003d new Salary(VALID_SALARY);","lastModifiedDate":"2024-03-09"},{"lineNumber":211,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedSalary, ParserUtil.parseSalary(salaryWithWhitespace));","lastModifiedDate":"2024-03-09"},{"lineNumber":212,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":213,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":214,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":215,"author":{"gitId":"chiageng"},"content":" public void parseProduct_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":216,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseSalary((String) null));","lastModifiedDate":"2024-03-09"},{"lineNumber":217,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":218,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":219,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":220,"author":{"gitId":"chiageng"},"content":" public void parseProduct_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":221,"author":{"gitId":"chiageng"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseProduct(INVALID_PRODUCT));","lastModifiedDate":"2024-03-09"},{"lineNumber":222,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":223,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":224,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":225,"author":{"gitId":"chiageng"},"content":" public void parseProduct_validValueWithoutWhitespace_returnsProduct() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":226,"author":{"gitId":"chiageng"},"content":" Product expectedProduct \u003d new Product(VALID_PRODUCT);","lastModifiedDate":"2024-03-09"},{"lineNumber":227,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedProduct, ParserUtil.parseProduct(VALID_PRODUCT));","lastModifiedDate":"2024-03-09"},{"lineNumber":228,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":229,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":230,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":231,"author":{"gitId":"chiageng"},"content":" public void parseProduct_validValueWithWhitespace_returnsTrimmedProduct() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":232,"author":{"gitId":"chiageng"},"content":" String productWithWhitespace \u003d WHITESPACE + VALID_PRODUCT + WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":233,"author":{"gitId":"chiageng"},"content":" Product expectedProduct \u003d new Product(VALID_PRODUCT);","lastModifiedDate":"2024-03-09"},{"lineNumber":234,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedProduct, ParserUtil.parseProduct(productWithWhitespace));","lastModifiedDate":"2024-03-09"},{"lineNumber":235,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":236,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":237,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":238,"author":{"gitId":"chiageng"},"content":" public void parsePrice_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":239,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePrice((String) null));","lastModifiedDate":"2024-03-09"},{"lineNumber":240,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":241,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":242,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":243,"author":{"gitId":"chiageng"},"content":" public void parsePrice_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":244,"author":{"gitId":"chiageng"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePrice(INVALID_PRICE));","lastModifiedDate":"2024-03-09"},{"lineNumber":245,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":246,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":247,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":248,"author":{"gitId":"chiageng"},"content":" public void parsePrice_validValueWithoutWhitespace_returnsPrice() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":249,"author":{"gitId":"chiageng"},"content":" Price expectedPrice \u003d new Price(VALID_PRICE);","lastModifiedDate":"2024-03-09"},{"lineNumber":250,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedPrice, ParserUtil.parsePrice(VALID_PRICE));","lastModifiedDate":"2024-03-09"},{"lineNumber":251,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":252,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":253,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":254,"author":{"gitId":"chiageng"},"content":" public void parsePrice_validValueWithWhitespace_returnsTrimmedPrice() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":255,"author":{"gitId":"chiageng"},"content":" String priceWithWhitespace \u003d WHITESPACE + VALID_PRICE + WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":256,"author":{"gitId":"chiageng"},"content":" Price expectedPrice \u003d new Price(VALID_PRICE);","lastModifiedDate":"2024-03-09"},{"lineNumber":257,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedPrice, ParserUtil.parsePrice(priceWithWhitespace));","lastModifiedDate":"2024-03-09"},{"lineNumber":258,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":259,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":260,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":261,"author":{"gitId":"chiageng"},"content":" public void parseSkill_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":262,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseSkill((String) null));","lastModifiedDate":"2024-03-09"},{"lineNumber":263,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":264,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":265,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":266,"author":{"gitId":"chiageng"},"content":" public void parseSkill_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":267,"author":{"gitId":"chiageng"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseSkill(INVALID_SKILL));","lastModifiedDate":"2024-03-09"},{"lineNumber":268,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":269,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":270,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":271,"author":{"gitId":"chiageng"},"content":" public void parseSkill_validValueWithoutWhitespace_returnsSkill() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":272,"author":{"gitId":"chiageng"},"content":" Skill expectedSkill \u003d new Skill(VALID_SKILL);","lastModifiedDate":"2024-03-09"},{"lineNumber":273,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedSkill, ParserUtil.parseSkill(VALID_SKILL));","lastModifiedDate":"2024-03-09"},{"lineNumber":274,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":275,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":276,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":277,"author":{"gitId":"chiageng"},"content":" public void parseSkill_validValueWithWhitespace_returnsTrimmedSkill() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":278,"author":{"gitId":"chiageng"},"content":" String skillWithWhitespace \u003d WHITESPACE + VALID_SKILL + WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":279,"author":{"gitId":"chiageng"},"content":" Skill expectedSkill \u003d new Skill(VALID_SKILL);","lastModifiedDate":"2024-03-09"},{"lineNumber":280,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedSkill, ParserUtil.parseSkill(skillWithWhitespace));","lastModifiedDate":"2024-03-09"},{"lineNumber":281,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":282,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":283,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":284,"author":{"gitId":"chiageng"},"content":" public void parseCommission_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":285,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseCommission((String) null));","lastModifiedDate":"2024-03-09"},{"lineNumber":286,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":287,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":288,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":289,"author":{"gitId":"chiageng"},"content":" public void parseCommission_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":290,"author":{"gitId":"chiageng"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseCommission(INVALID_COMMISSION));","lastModifiedDate":"2024-03-09"},{"lineNumber":291,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":292,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":293,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":294,"author":{"gitId":"chiageng"},"content":" public void parseCommission_validValueWithoutWhitespace_returnsCommission() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":295,"author":{"gitId":"chiageng"},"content":" Commission expectedCommission \u003d new Commission(VALID_COMMISSION);","lastModifiedDate":"2024-03-09"},{"lineNumber":296,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedCommission, ParserUtil.parseCommission(VALID_COMMISSION));","lastModifiedDate":"2024-03-09"},{"lineNumber":297,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":298,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":299,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":300,"author":{"gitId":"chiageng"},"content":" public void parseCommission_validValueWithWhitespace_returnsTrimmedCommission() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":301,"author":{"gitId":"chiageng"},"content":" String commissionWithWhitespace \u003d WHITESPACE + VALID_COMMISSION + WHITESPACE;","lastModifiedDate":"2024-03-09"},{"lineNumber":302,"author":{"gitId":"chiageng"},"content":" Commission expectedCommission \u003d new Commission(VALID_COMMISSION);","lastModifiedDate":"2024-03-09"},{"lineNumber":303,"author":{"gitId":"chiageng"},"content":" assertEquals(expectedCommission, ParserUtil.parseCommission(commissionWithWhitespace));","lastModifiedDate":"2024-03-09"},{"lineNumber":304,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":305,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":306,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":307,"author":{"gitId":"-"},"content":" public void parseTag_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTag(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":311,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":312,"author":{"gitId":"-"},"content":" public void parseTag_invalidValue_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTag(INVALID_TAG));","lastModifiedDate":"2019-03-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":316,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":317,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithoutWhitespace_returnsTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":318,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":319,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(VALID_TAG_1));","lastModifiedDate":"2017-05-30"},{"lineNumber":320,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":322,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":323,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithWhitespace_returnsTrimmedTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":324,"author":{"gitId":"-"},"content":" String tagWithWhitespace \u003d WHITESPACE + VALID_TAG_1 + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":326,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(tagWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":327,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":329,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":330,"author":{"gitId":"-"},"content":" public void parseTags_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTags(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":334,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":335,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithInvalidTags_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, INVALID_TAG)));","lastModifiedDate":"2019-03-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":339,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":340,"author":{"gitId":"-"},"content":" public void parseTags_emptyCollection_returnsEmptySet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":341,"author":{"gitId":"-"},"content":" assertTrue(ParserUtil.parseTags(Collections.emptyList()).isEmpty());","lastModifiedDate":"2017-05-22"},{"lineNumber":342,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":344,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":345,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e actualTagSet \u003d ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, VALID_TAG_2));","lastModifiedDate":"2017-05-22"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e expectedTagSet \u003d new HashSet\u003cTag\u003e(Arrays.asList(new Tag(VALID_TAG_1), new Tag(VALID_TAG_2)));","lastModifiedDate":"2017-05-22"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":349,"author":{"gitId":"-"},"content":" assertEquals(expectedTagSet, actualTagSet);","lastModifiedDate":"2017-05-22"},{"lineNumber":350,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":351,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-22"}],"authorContributionMap":{"chiageng":156,"-":195}},{"path":"src/test/java/seedu/address/model/person/CommissionTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"public class CommissionTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Commission(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public void constructor_invalidCommission_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" String invalidCommission \u003d \"20/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Commission(invalidCommission));","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public void isValidCommission() {","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" // null commission","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e Commission.isValidCommission(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" // invalid commission","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" assertFalse(Commission.isValidCommission(\"\")); // empty string","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertFalse(Commission.isValidCommission(\" \")); // spaces only","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" assertFalse(Commission.isValidCommission(\"50\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" assertFalse(Commission.isValidCommission(\"50/hr\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertFalse(Commission.isValidCommission(\"$50\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" // valid commission","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" assertTrue(Commission.isValidCommission(\"$500/hr\")); // exactly 3 numbers","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" assertTrue(Commission.isValidCommission(\"$50/hr\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" Commission commission \u003d new Commission(\"$50/hr\");","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" assertTrue(commission.equals(new Commission(\"$50/hr\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" assertTrue(commission.equals(commission));","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" assertFalse(commission.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" assertFalse(commission.equals(\"$50/hr\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" assertFalse(commission.equals(new Commission(\"$60/hr\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":58}},{"path":"src/test/java/seedu/address/model/person/EmploymentTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"public class EmploymentTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Name(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public void constructor_invalidEmployment_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" String invalidEmployment \u003d \"\";","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Employment(invalidEmployment));","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public void isValidEmployment() {","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" // null Employment","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e Employment.isValidEmployment(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" // invalid Employment","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" assertFalse(Employment.isValidEmployment(\"\")); // empty string","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertFalse(Employment.isValidEmployment(\" \")); // spaces only","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" assertFalse(Employment.isValidEmployment(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" assertFalse(Employment.isValidEmployment(\"peter*\")); // contains non-alphanumeric characters","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertFalse(Employment.isValidEmployment(\"other\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" // valid Employment","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" assertTrue(Employment.isValidEmployment(\"part-time\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" assertTrue(Employment.isValidEmployment(\"full-time\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" Employment employment \u003d new Employment(\"part-time\");","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" assertTrue(employment.equals(new Employment(\"part-time\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" assertTrue(employment.equals(employment));","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" assertFalse(employment.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" assertFalse(employment.equals(\"part-time\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" assertFalse(employment.equals(new Employment(\"full-time\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":58}},{"path":"src/test/java/seedu/address/model/person/MaintainerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.ALICEMAINTAINER;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BOBMAINTAINER;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.MaintainerBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"public class MaintainerTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" Maintainer person \u003d new MaintainerBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" public void isSameStaff() {","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICEMAINTAINER.isSamePerson(ALICEMAINTAINER));","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.isSamePerson(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" Person editedAlice \u003d new MaintainerBuilder(ALICEMAINTAINER).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" .withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" .withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICEMAINTAINER.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new MaintainerBuilder(ALICEMAINTAINER).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" Person editedBob \u003d new MaintainerBuilder(BOBMAINTAINER).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" assertTrue(BOBMAINTAINER.isSamePerson(editedBob));","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" editedBob \u003d new MaintainerBuilder(BOBMAINTAINER).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" assertFalse(BOBMAINTAINER.isSamePerson(editedBob));","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" Person aliceCopy \u003d new MaintainerBuilder(ALICEMAINTAINER).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICEMAINTAINER.equals(aliceCopy));","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICEMAINTAINER.equals(ALICEMAINTAINER));","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" // different type -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.equals(5));","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.equals(BOBMAINTAINER));","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" // different name -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" Person editedAlice \u003d new MaintainerBuilder(ALICEMAINTAINER).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new MaintainerBuilder(ALICEMAINTAINER).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" // different email -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new MaintainerBuilder(ALICEMAINTAINER).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" // different address -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new MaintainerBuilder(ALICEMAINTAINER).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICEMAINTAINER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" String expected \u003d Maintainer.class.getCanonicalName() + \"{name\u003d\" + ALICEMAINTAINER.getName()","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" + \", phone\u003d\"","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" + ALICEMAINTAINER.getPhone()","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" + \", email\u003d\" + ALICEMAINTAINER.getEmail() + \", address\u003d\"","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" + ALICEMAINTAINER.getAddress()","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" + \", tags\u003d\" + ALICEMAINTAINER.getTags()","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" + \", skill\u003d\" + ALICEMAINTAINER.getSkill()","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" + \", commission\u003d\" + ALICEMAINTAINER.getCommission()","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" + \"}\";","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" assertEquals(expected, ALICEMAINTAINER.toString());","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":108}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2018-04-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2020-12-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2020-12-18"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedBob \u003d new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" assertTrue(BOB.isSamePerson(editedBob));","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2020-12-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editedBob \u003d new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName() + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2019-02-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", address\u003d\" + ALICE.getAddress() + \", tags\u003d\" + ALICE.getTags() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"chiageng":3,"-":98}},{"path":"src/test/java/seedu/address/model/person/PriceTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"public class PriceTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Price(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public void constructor_invalidPrice_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" String invalidPrice \u003d \"20/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Price(invalidPrice));","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public void isValidPrice() {","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" // null Price","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e Price.isValidPrice(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" // invalid Price","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" assertFalse(Price.isValidPrice(\"\")); // empty string","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertFalse(Price.isValidPrice(\" \")); // spaces only","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" assertFalse(Price.isValidPrice(\"50\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" assertFalse(Price.isValidPrice(\"50/bag\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertFalse(Price.isValidPrice(\"$50\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" // valid Price","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" assertTrue(Price.isValidPrice(\"$500/bag\")); // exactly 3 numbers","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" assertTrue(Price.isValidPrice(\"$50/piece\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" Price price \u003d new Price(\"$50/bag\");","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" assertTrue(price.equals(new Price(\"$50/bag\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" assertTrue(price.equals(price));","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" assertFalse(price.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" assertFalse(price.equals(\"$50/bag\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" assertFalse(price.equals(new Price(\"$50/piece\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":58}},{"path":"src/test/java/seedu/address/model/person/ProductTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"public class ProductTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Product(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public void constructor_invalidProduct_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" String invalidProduct \u003d \"\";","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Product(invalidProduct));","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public void isValidProduct() {","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" // null Product","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e Product.isValidProduct(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" // invalid Product","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" assertFalse(Product.isValidProduct(\"\")); // empty string","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertFalse(Product.isValidProduct(\" \")); // spaces only","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" // valid Product","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertTrue(Product.isValidProduct(\"pooch food\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" assertTrue(Product.isValidProduct(\"medicine\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" assertTrue(Product.isValidProduct(\"pooch-toy\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" Product product \u003d new Product(\"Valid Product\");","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" assertTrue(product.equals(new Product(\"Valid Product\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" assertTrue(product.equals(product));","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" assertFalse(product.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" assertFalse(product.equals(\"Valid Product\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" assertFalse(product.equals(new Product(\"Other Valid Product\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":56}},{"path":"src/test/java/seedu/address/model/person/SalaryTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"public class SalaryTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Salary(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public void constructor_invalidSalary_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" String invalidSalary \u003d \"20/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Salary(invalidSalary));","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public void isValidSalary() {","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" // null Salary","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e Salary.isValidSalary(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" // invalid Salary","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" assertFalse(Salary.isValidSalary(\"\")); // empty string","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertFalse(Salary.isValidSalary(\" \")); // spaces only","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" assertFalse(Salary.isValidSalary(\"50\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" assertFalse(Salary.isValidSalary(\"50/hr\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertFalse(Salary.isValidSalary(\"$50\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" // valid Salary","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" assertTrue(Salary.isValidSalary(\"$500/hr\")); // exactly 3 numbers","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" assertTrue(Salary.isValidSalary(\"$50/hr\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" Salary salary \u003d new Salary(\"$50/hr\");","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" assertTrue(salary.equals(new Salary(\"$50/hr\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" assertTrue(salary.equals(salary));","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" assertFalse(salary.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" assertFalse(salary.equals(\"$50/hr\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" assertFalse(salary.equals(new Salary(\"$60/hr\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":58}},{"path":"src/test/java/seedu/address/model/person/SkillTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"public class SkillTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Skill(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" public void constructor_invalidSkill_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":" String invalidSkill \u003d \"\";","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Skill(invalidSkill));","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public void isValidSkill() {","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" // null skill","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" assertThrows(NullPointerException.class, () -\u003e Skill.isValidSkill(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" // invalid skills","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" assertFalse(Skill.isValidSkill(\"\")); // empty string","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertFalse(Skill.isValidSkill(\" \")); // spaces only","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" // valid skill","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertTrue(Skill.isValidSkill(\"train dog\")); // exactly 3 numbers","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" assertTrue(Skill.isValidSkill(\"training dog\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" Skill skill \u003d new Skill(\"train dog\");","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" assertTrue(skill.equals(new Skill(\"train dog\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" assertTrue(skill.equals(skill));","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" assertFalse(skill.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" assertFalse(skill.equals(\"train dog\"));","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" assertFalse(skill.equals(new Skill(\"train\")));","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":55}},{"path":"src/test/java/seedu/address/model/person/StaffTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.ALICESTAFF;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BOBSTAFF;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.StaffBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"public class StaffTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" Staff person \u003d new StaffBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" public void isSameStaff() {","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICESTAFF.isSamePerson(ALICESTAFF));","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.isSamePerson(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" Person editedAlice \u003d new StaffBuilder(ALICESTAFF).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" .withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new StaffBuilder(ALICESTAFF).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" Person editedBob \u003d new StaffBuilder(BOBSTAFF).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" assertTrue(BOBSTAFF.isSamePerson(editedBob));","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" editedBob \u003d new StaffBuilder(BOBSTAFF).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" assertFalse(BOBSTAFF.isSamePerson(editedBob));","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" Person aliceCopy \u003d new StaffBuilder(ALICESTAFF).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICESTAFF.equals(aliceCopy));","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICESTAFF.equals(ALICESTAFF));","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" // different type -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.equals(5));","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.equals(BOBSTAFF));","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" // different name -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" Person editedAlice \u003d new StaffBuilder(ALICESTAFF).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new StaffBuilder(ALICESTAFF).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" // different email -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new StaffBuilder(ALICESTAFF).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" // different address -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new StaffBuilder(ALICESTAFF).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESTAFF.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" String expected \u003d Staff.class.getCanonicalName() + \"{name\u003d\" + ALICESTAFF.getName() + \", phone\u003d\"","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" + ALICESTAFF.getPhone()","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" + \", email\u003d\" + ALICESTAFF.getEmail() + \", address\u003d\"","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" + ALICESTAFF.getAddress()","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" + \", tags\u003d\" + ALICESTAFF.getTags()","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" + \", salary\u003d\" + ALICESTAFF.getSalary()","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" + \", employment\u003d\" + ALICESTAFF.getEmployment()","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" + \"}\";","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" assertEquals(expected, ALICESTAFF.toString());","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":107}},{"path":"src/test/java/seedu/address/model/person/SupplierTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.ALICESUPPLIER;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BOBSUPPLIER;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import seedu.address.testutil.SupplierBuilder;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"public class SupplierTest {","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" Supplier person \u003d new SupplierBuilder().build();","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":" public void isSameStaff() {","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICESUPPLIER.isSamePerson(ALICESUPPLIER));","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.isSamePerson(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" Person editedAlice \u003d new SupplierBuilder(ALICESUPPLIER).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" .withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICESUPPLIER.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new SupplierBuilder(ALICESUPPLIER).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" Person editedBob \u003d new SupplierBuilder(BOBSUPPLIER).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" assertTrue(BOBSUPPLIER.isSamePerson(editedBob));","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" editedBob \u003d new SupplierBuilder(BOBSUPPLIER).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" assertFalse(BOBSUPPLIER.isSamePerson(editedBob));","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" public void equals() {","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" Person aliceCopy \u003d new SupplierBuilder(ALICESUPPLIER).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICESUPPLIER.equals(aliceCopy));","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" assertTrue(ALICESUPPLIER.equals(ALICESUPPLIER));","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.equals(null));","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" // different type -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.equals(5));","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.equals(BOBSUPPLIER));","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" // different name -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" Person editedAlice \u003d new SupplierBuilder(ALICESUPPLIER).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new SupplierBuilder(ALICESUPPLIER).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" // different email -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new SupplierBuilder(ALICESUPPLIER).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" // different address -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new SupplierBuilder(ALICESUPPLIER).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICESUPPLIER.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" String expected \u003d Supplier.class.getCanonicalName() + \"{name\u003d\" + ALICESUPPLIER.getName() + \", phone\u003d\"","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" + ALICESUPPLIER.getPhone()","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" + \", email\u003d\" + ALICESUPPLIER.getEmail() + \", address\u003d\"","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" + ALICESUPPLIER.getAddress()","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" + \", tags\u003d\" + ALICESUPPLIER.getTags()","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" + \", product\u003d\" + ALICESUPPLIER.getProduct()","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" + \", price\u003d\" + ALICESUPPLIER.getPrice()","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" + \"}\";","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" assertEquals(expected, ALICESUPPLIER.toString());","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":106}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BENSONMAINTAINER;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BENSONSTAFF;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.testutil.TypicalPersons.BENSONSUPPLIER;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Price;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Product;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_SALARY \u003d \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_PRODUCT \u003d \" \";","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_EMPLOYMENT \u003d \"employment\";","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_PRICE \u003d \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_SKILL \u003d \" \";","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" private static final String INVALID_COMMISSION \u003d \"20\";","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" private static final String NULL \u003d null;","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" private static final String VALID_SALARY \u003d BENSONSTAFF.getSalary().toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" private static final String VALID_EMPLOYMENT \u003d BENSONSTAFF.getEmployment().toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" private static final String VALID_PRODUCT \u003d BENSONSUPPLIER.getProduct().toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" private static final String VALID_PRICE \u003d BENSONSUPPLIER.getPrice().toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" private static final String VALID_SKILL \u003d BENSONMAINTAINER.getSkill().toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" private static final String VALID_COMMISSION \u003d BENSONMAINTAINER.getCommission().toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" public void toModelType_validStaffDetails_returnsPerson() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedStaff(BENSONSTAFF);","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" assertEquals(BENSONSTAFF, person.toModelType());","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" public void toModelType_validSupplierDetails_returnsPerson() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" JsonAdaptedSupplier person \u003d new JsonAdaptedSupplier(BENSONSUPPLIER);","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" assertEquals(BENSONSUPPLIER, person.toModelType());","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" public void toModelType_validMaintainerDetails_returnsPerson() throws Exception {","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedMaintainer(BENSONMAINTAINER);","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" assertEquals(BENSONMAINTAINER, person.toModelType());","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":130,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":136,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":137,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":138,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":143,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":145,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":146,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":147,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":151,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":152,"author":{"gitId":"chiageng"},"content":" public void toModelType_invalidSalary_throwsIllegalValueException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":153,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-09"},{"lineNumber":154,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":155,"author":{"gitId":"chiageng"},"content":" INVALID_SALARY, VALID_EMPLOYMENT, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":156,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d Salary.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-03-09"},{"lineNumber":157,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-09"},{"lineNumber":158,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":159,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":160,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":161,"author":{"gitId":"chiageng"},"content":" public void toModelType_invalidEmployment_throwsIllegalValueException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":162,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-09"},{"lineNumber":163,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":164,"author":{"gitId":"chiageng"},"content":" VALID_SALARY, INVALID_EMPLOYMENT, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":165,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d Employment.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-03-09"},{"lineNumber":166,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-09"},{"lineNumber":167,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":168,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":169,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":170,"author":{"gitId":"chiageng"},"content":" public void toModelType_invalidProduct_throwsIllegalValueException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":171,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-09"},{"lineNumber":172,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":173,"author":{"gitId":"chiageng"},"content":" NULL, NULL, INVALID_PRODUCT, VALID_PRICE, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":174,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d Product.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-03-09"},{"lineNumber":175,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-09"},{"lineNumber":176,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":177,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":178,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":179,"author":{"gitId":"chiageng"},"content":" public void toModelType_invalidPrice_throwsIllegalValueException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":180,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-09"},{"lineNumber":181,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":182,"author":{"gitId":"chiageng"},"content":" NULL, NULL, VALID_PRODUCT, INVALID_PRICE, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":183,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d Price.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-03-09"},{"lineNumber":184,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-09"},{"lineNumber":185,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":186,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":187,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":188,"author":{"gitId":"chiageng"},"content":" public void toModelType_invalidSkill_throwsIllegalValueException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":189,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-09"},{"lineNumber":190,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":191,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, INVALID_SKILL, VALID_COMMISSION);","lastModifiedDate":"2024-03-09"},{"lineNumber":192,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d Skill.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-03-09"},{"lineNumber":193,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-09"},{"lineNumber":194,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":195,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":196,"author":{"gitId":"chiageng"},"content":" @Test","lastModifiedDate":"2024-03-09"},{"lineNumber":197,"author":{"gitId":"chiageng"},"content":" public void toModelType_invalidCommission_throwsIllegalValueException() {","lastModifiedDate":"2024-03-09"},{"lineNumber":198,"author":{"gitId":"chiageng"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-09"},{"lineNumber":199,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS,","lastModifiedDate":"2024-03-09"},{"lineNumber":200,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, VALID_SKILL, INVALID_COMMISSION);","lastModifiedDate":"2024-03-09"},{"lineNumber":201,"author":{"gitId":"chiageng"},"content":" String expectedMessage \u003d Commission.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-03-09"},{"lineNumber":202,"author":{"gitId":"chiageng"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-09"},{"lineNumber":203,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":204,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":206,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":207,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":208,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":209,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":210,"author":{"gitId":"chiageng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags,","lastModifiedDate":"2024-03-09"},{"lineNumber":211,"author":{"gitId":"chiageng"},"content":" NULL, NULL, NULL, NULL, NULL, NULL);","lastModifiedDate":"2024-03-09"},{"lineNumber":212,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":213,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":215,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"chiageng":115,"-":100}},{"path":"src/test/java/seedu/address/testutil/MaintainerBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.testutil;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import java.util.HashSet;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"public class MaintainerBuilder {","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_TAG \u003d \"maintainer\";","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_SKILL \u003d \"train dog\";","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_COMMISSION \u003d \"$50/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" private Name name;","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" private Phone phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" private Email email;","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" private Address address;","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" private Skill skill;","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" private Commission commission;","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" private Tag tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" * Creates a {@code MaintainerBuilder} with the default details.","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder() {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" skill \u003d new Skill(DEFAULT_SKILL);","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" commission \u003d new Commission(DEFAULT_COMMISSION);","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" * Initializes the MaintainerBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder(Maintainer personToCopy) {","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" skill \u003d personToCopy.getSkill();","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" commission \u003d personToCopy.getCommission();","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Name} of the {@code Maintainer} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder withName(String name) {","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Maintainer} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder withTags(String ... tags) {","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Address} of the {@code Maintainer} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder withAddress(String address) {","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Phone} of the {@code Maintainer} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder withPhone(String phone) {","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Email} of the {@code Maintainer} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder withEmail(String email) {","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Product} of the {@code Maintainer} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder withSkill(String skill) {","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" this.skill \u003d new Skill(skill);","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Price} of the {@code Maintainer} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" public MaintainerBuilder withCommission(String commission) {","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" this.commission \u003d new Commission(commission);","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" public Maintainer build() {","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" return new Maintainer(name, phone, email, address, tags, skill, commission);","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":129}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-01-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-01-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-01-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-04-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-01-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-04-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_TAG \u003d \"other\";","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" private Tag tag;","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return new Person(name, phone, email, address, tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"chiageng":8,"-":95}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_COMMISSION;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMPLOYMENT;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRICE;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PRODUCT;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_SKILL;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddMaintainerCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddStaffCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"import seedu.address.logic.commands.AddSupplierCommand;","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2018-03-26"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-03-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public static String getAddStaffCommand(Staff person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" return AddStaffCommand.COMMAND_WORD + \" \" + getStaffDetails(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" public static String getAddSupplierCommand(Supplier person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" return AddSupplierCommand.COMMAND_WORD + \" \" + getSupplierDetails(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" public static String getAddMaintainerCommand(Maintainer person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" return AddMaintainerCommand.COMMAND_WORD + \" \" + getMaintainerDetails(person);","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" );","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" * Returns the part of command string for the given {@code staff}\u0027s details.","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" public static String getStaffDetails(Staff person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_SALARY + person.getSalary().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_EMPLOYMENT + person.getEmployment().employment + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" );","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":" return sb.toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" * Returns the part of command string for the given {@code supplier}\u0027s details.","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" public static String getSupplierDetails(Supplier person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_PRODUCT + person.getProduct().product + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_PRICE + person.getPrice().price + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" );","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" return sb.toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" * Returns the part of command string for the given {@code maintainer}\u0027s details.","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" public static String getMaintainerDetails(Maintainer person) {","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_SKILL + person.getSkill().skill + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":" sb.append(PREFIX_COMMISSION + person.getCommission().commission + \" \");","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":126,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":127,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":129,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":130,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":131,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":134,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":135,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":136,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":137,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":138,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":139,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":144,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"chiageng":79,"-":65}},{"path":"src/test/java/seedu/address/testutil/StaffBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.testutil;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import java.util.HashSet;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"public class StaffBuilder {","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_TAG \u003d \"staff\";","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_SALARY \u003d \"$50/hr\";","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_EMPLOYMENT \u003d \"part-time\";","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" private Name name;","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" private Phone phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" private Email email;","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" private Address address;","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" private Salary salary;","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" private Employment employment;","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" private Tag tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" * Creates a {@code StaffBuilder} with the default details.","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public StaffBuilder() {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" salary \u003d new Salary(DEFAULT_SALARY);","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" employment \u003d new Employment(DEFAULT_EMPLOYMENT);","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" * Initializes the StaffBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public StaffBuilder(Staff personToCopy) {","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" salary \u003d personToCopy.getSalary();","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" employment \u003d personToCopy.getEmployment();","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Name} of the {@code Staff} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" public StaffBuilder withName(String name) {","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Staff} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" public StaffBuilder withTags(String ... tags) {","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Address} of the {@code Staff} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" public StaffBuilder withAddress(String address) {","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Phone} of the {@code Staff} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" public StaffBuilder withPhone(String phone) {","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Email} of the {@code Staff} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" public StaffBuilder withEmail(String email) {","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Salary} of the {@code Staff} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" public StaffBuilder withSalary(String salary) {","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" this.salary \u003d new Salary(salary);","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Employment} of the {@code Staff} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" public StaffBuilder withEmployment(String employment) {","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" this.employment \u003d new Employment(employment);","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" public Staff build() {","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" return new Staff(name, phone, email, address, tags, salary, employment);","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":129}},{"path":"src/test/java/seedu/address/testutil/SupplierBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"package seedu.address.testutil;","lastModifiedDate":"2024-03-09"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"import java.util.HashSet;","lastModifiedDate":"2024-03-09"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-09"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-03-09"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-03-09"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Price;","lastModifiedDate":"2024-03-09"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Product;","lastModifiedDate":"2024-03-09"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"/**","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"public class SupplierBuilder {","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2024-03-09"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2024-03-09"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_TAG \u003d \"supplier\";","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_PRODUCT \u003d \"pooch food\";","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":" public static final String DEFAULT_PRICE \u003d \"$50/bag\";","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"chiageng"},"content":" private Name name;","lastModifiedDate":"2024-03-09"},{"lineNumber":29,"author":{"gitId":"chiageng"},"content":" private Phone phone;","lastModifiedDate":"2024-03-09"},{"lineNumber":30,"author":{"gitId":"chiageng"},"content":" private Email email;","lastModifiedDate":"2024-03-09"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":" private Address address;","lastModifiedDate":"2024-03-09"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" private Price price;","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":" private Product product;","lastModifiedDate":"2024-03-09"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2024-03-09"},{"lineNumber":35,"author":{"gitId":"chiageng"},"content":" private Tag tag;","lastModifiedDate":"2024-03-09"},{"lineNumber":36,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":37,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":" * Creates a {@code SupplierBuilder} with the default details.","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder() {","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" product \u003d new Product(DEFAULT_PRODUCT);","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" price \u003d new Price(DEFAULT_PRICE);","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" * Initializes the SupplierBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder(Supplier personToCopy) {","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2024-03-09"},{"lineNumber":60,"author":{"gitId":"chiageng"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2024-03-09"},{"lineNumber":61,"author":{"gitId":"chiageng"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-09"},{"lineNumber":62,"author":{"gitId":"chiageng"},"content":" tags.add(tag);","lastModifiedDate":"2024-03-09"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":" product \u003d personToCopy.getProduct();","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" price \u003d personToCopy.getPrice();","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Name} of the {@code Supplier} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder withName(String name) {","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Supplier} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder withTags(String ... tags) {","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" /*","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Address} of the {@code Supplier} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder withAddress(String address) {","lastModifiedDate":"2024-03-09"},{"lineNumber":89,"author":{"gitId":"chiageng"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2024-03-09"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Phone} of the {@code Supplier} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder withPhone(String phone) {","lastModifiedDate":"2024-03-09"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2024-03-09"},{"lineNumber":98,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":99,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Email} of the {@code Supplier} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":103,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":104,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder withEmail(String email) {","lastModifiedDate":"2024-03-09"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Product} of the {@code Supplier} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder withProduct(String product) {","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" this.product \u003d new Product(product);","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":116,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" /**","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":" * Sets the {@code Price} of the {@code Supplier} that we are building.","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" */","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" public SupplierBuilder withPrice(String price) {","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" this.price \u003d new Price(price);","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"chiageng"},"content":" return this;","lastModifiedDate":"2024-03-09"},{"lineNumber":123,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":124,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":125,"author":{"gitId":"chiageng"},"content":" public Supplier build() {","lastModifiedDate":"2024-03-09"},{"lineNumber":126,"author":{"gitId":"chiageng"},"content":" return new Supplier(name, phone, email, address, tags, product, price);","lastModifiedDate":"2024-03-09"},{"lineNumber":127,"author":{"gitId":"chiageng"},"content":" }","lastModifiedDate":"2024-03-09"},{"lineNumber":128,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":129,"author":{"gitId":"chiageng"},"content":"}","lastModifiedDate":"2024-03-09"}],"authorContributionMap":{"chiageng":129}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_COMMISSION_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMPLOYMENT_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PRICE_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PRODUCT_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":15,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_SALARY_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":16,"author":{"gitId":"chiageng"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_SKILL_BOB;","lastModifiedDate":"2024-03-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-08-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Maintainer;","lastModifiedDate":"2024-03-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":26,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Staff;","lastModifiedDate":"2024-03-09"},{"lineNumber":27,"author":{"gitId":"chiageng"},"content":"import seedu.address.model.person.Supplier;","lastModifiedDate":"2024-03-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2018-04-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":38,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":39,"author":{"gitId":"chiageng"},"content":" public static final Staff ALICESTAFF \u003d new StaffBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2024-03-09"},{"lineNumber":40,"author":{"gitId":"chiageng"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2024-03-09"},{"lineNumber":41,"author":{"gitId":"chiageng"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2024-03-09"},{"lineNumber":42,"author":{"gitId":"chiageng"},"content":" .withTags(\"friends\")","lastModifiedDate":"2024-03-09"},{"lineNumber":43,"author":{"gitId":"chiageng"},"content":" .withSalary(\"$50/hr\")","lastModifiedDate":"2024-03-09"},{"lineNumber":44,"author":{"gitId":"chiageng"},"content":" .withEmployment(\"part-time\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":45,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":46,"author":{"gitId":"chiageng"},"content":" public static final Supplier ALICESUPPLIER \u003d new SupplierBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2024-03-09"},{"lineNumber":47,"author":{"gitId":"chiageng"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2024-03-09"},{"lineNumber":48,"author":{"gitId":"chiageng"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2024-03-09"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":" .withTags(\"friends\")","lastModifiedDate":"2024-03-09"},{"lineNumber":50,"author":{"gitId":"chiageng"},"content":" .withProduct(\"pooch food\")","lastModifiedDate":"2024-03-09"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":" .withPrice(\"$50/bag\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" public static final Maintainer ALICEMAINTAINER \u003d new MaintainerBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2024-03-09"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2024-03-09"},{"lineNumber":55,"author":{"gitId":"chiageng"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2024-03-09"},{"lineNumber":56,"author":{"gitId":"chiageng"},"content":" .withTags(\"friends\")","lastModifiedDate":"2024-03-09"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":" .withSkill(\"train dog\")","lastModifiedDate":"2024-03-09"},{"lineNumber":58,"author":{"gitId":"chiageng"},"content":" .withCommission(\"$50/hr\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2017-09-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":63,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":64,"author":{"gitId":"chiageng"},"content":" public static final Staff BENSONSTAFF \u003d new StaffBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2024-03-09"},{"lineNumber":65,"author":{"gitId":"chiageng"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2024-03-09"},{"lineNumber":66,"author":{"gitId":"chiageng"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2024-03-09"},{"lineNumber":67,"author":{"gitId":"chiageng"},"content":" .withTags(\"owesMoney\", \"friends\")","lastModifiedDate":"2024-03-09"},{"lineNumber":68,"author":{"gitId":"chiageng"},"content":" .withEmployment(\"part-time\")","lastModifiedDate":"2024-03-09"},{"lineNumber":69,"author":{"gitId":"chiageng"},"content":" .withSalary(\"$50/hr\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":70,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":71,"author":{"gitId":"chiageng"},"content":" public static final Supplier BENSONSUPPLIER \u003d new SupplierBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2024-03-09"},{"lineNumber":72,"author":{"gitId":"chiageng"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2024-03-09"},{"lineNumber":73,"author":{"gitId":"chiageng"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2024-03-09"},{"lineNumber":74,"author":{"gitId":"chiageng"},"content":" .withTags(\"owesMoney\", \"friends\")","lastModifiedDate":"2024-03-09"},{"lineNumber":75,"author":{"gitId":"chiageng"},"content":" .withProduct(\"pooch medicine\")","lastModifiedDate":"2024-03-09"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":" .withPrice(\"$50/injection\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":77,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":" public static final Maintainer BENSONMAINTAINER \u003d new MaintainerBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2024-03-09"},{"lineNumber":79,"author":{"gitId":"chiageng"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2024-03-09"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2024-03-09"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":" .withTags(\"owesMoney\", \"friends\")","lastModifiedDate":"2024-03-09"},{"lineNumber":82,"author":{"gitId":"chiageng"},"content":" .withSkill(\"train dog\")","lastModifiedDate":"2024-03-09"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":" .withCommission(\"$50/hr\").build();","lastModifiedDate":"2024-03-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .withEmail(\"heinz@example.com\").withAddress(\"wall street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .withEmail(\"cornelia@example.com\").withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2018-03-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .withEmail(\"werner@example.com\").withAddress(\"michegan ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .withEmail(\"lydia@example.com\").withAddress(\"little tokyo\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" .withEmail(\"anna@example.com\").withAddress(\"4th street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":" .withEmail(\"stefan@example.com\").withAddress(\"little india\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":99,"author":{"gitId":"-"},"content":" .withEmail(\"hans@example.com\").withAddress(\"chicago ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":" .build();","lastModifiedDate":"2024-03-09"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":" public static final Staff BOBSTAFF \u003d new StaffBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":108,"author":{"gitId":"chiageng"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":109,"author":{"gitId":"chiageng"},"content":" .withEmployment(VALID_EMPLOYMENT_BOB).withSalary(VALID_SALARY_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2024-03-09"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":112,"author":{"gitId":"chiageng"},"content":" public static final Supplier BOBSUPPLIER \u003d new SupplierBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":113,"author":{"gitId":"chiageng"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":114,"author":{"gitId":"chiageng"},"content":" .withProduct(VALID_PRODUCT_BOB).withPrice(VALID_PRICE_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":117,"author":{"gitId":"chiageng"},"content":" public static final Maintainer BOBMAINTAINER \u003d new MaintainerBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":118,"author":{"gitId":"chiageng"},"content":" .withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":119,"author":{"gitId":"chiageng"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":120,"author":{"gitId":"chiageng"},"content":" .withSkill(VALID_SKILL_BOB).withCommission(VALID_COMMISSION_BOB)","lastModifiedDate":"2024-03-09"},{"lineNumber":121,"author":{"gitId":"chiageng"},"content":" .build();","lastModifiedDate":"2024-03-09"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":126,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":127,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":138,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":140,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"chiageng":64,"-":76}}] diff --git a/AY2324S2-CS2103T-W10-2_tp_master/commits.json b/AY2324S2-CS2103T-W10-2_tp_master/commits.json index 16462a9e..56c7fc60 100644 --- a/AY2324S2-CS2103T-W10-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Joshy837":[{"date":"2024-02-28","commitResults":[{"hash":"83bd77e2c927eb71330a172350bbeb2c4354c520","isMergeCommit":true,"messageTitle":"Merge pull request #27 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update user guide for edit command","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"9362d7c59af2aef8085369da97a6270abd3c3de9","isMergeCommit":false,"messageTitle":"Update AboutUs for Joshua","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"45608234968e00d33d132bb89c73e7ecf3745051","isMergeCommit":false,"messageTitle":"Update the UG (Search command)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":0}}},{"hash":"a90cca88103979eb145814e1639f626c0e8935f6","isMergeCommit":false,"messageTitle":"Update Joshua\u0027s Portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":0}}},{"hash":"c7a6a283a990aade8825fa3bcf1b0b618e6f0c89","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":1}}},{"hash":"1c12015820507b4515cfbfb6762599d1201c3af4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Joshy837/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"745bcde05582028a1eee51b5842a21acbfe65f5e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"# Conflicts:\n#\tREADME.md\n","fileTypesAndContributionMap":{}},{"hash":"9dd49354fbfe26b3477ba26b2a60e2a25fa3ad0b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":1}}},{"hash":"3f5fe05599fcb7aa94b2164978d233843a79802a","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":14}}},{"hash":"5347523a871cef9c8c13559455f47b5b1d20f810","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Joshy837/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a42049c7b085a1522bef594f2c01401f1c18f660","isMergeCommit":true,"messageTitle":"Update README.md and fix merge conflict","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9991889b06b52e9eb91fe051c7c41bae11336b69","isMergeCommit":false,"messageTitle":"Remove all AB3 references","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"718471ce494c5c1591bb3f88f9f51b9cd609237f","isMergeCommit":true,"messageTitle":"Merge pull request #43 from Joshy837/branch-readme","messageBody":"","fileTypesAndContributionMap":{}}]}],"chiageng":[{"date":"2024-03-01","commitResults":[{"hash":"c9d32a2812847939a6e3b9481807385d0f8d68eb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"481d16a1dd2443288f46f447b8aa6faefa88fb98","isMergeCommit":false,"messageTitle":"Update AboutUs.md and chiageng.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":4}}},{"hash":"f012713ded2d80524e6fb8ca2dde135d0895b610","isMergeCommit":false,"messageTitle":"Add User Guide for feature add","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":22}}},{"hash":"054e6a41a3956961f5c0b130393882a8d82dca49","isMergeCommit":false,"messageTitle":"Update developer guide on non functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"3fec7d1e12a7d3d08cd37930b3c84aa878341e39","isMergeCommit":false,"messageTitle":"Update use cases in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":64,"deletions":0}}},{"hash":"e26c4db963811a434ee64222507e81f687482493","isMergeCommit":false,"messageTitle":"Update non functional requirements in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":0}}}]},{"date":"2024-03-02","commitResults":[{"hash":"129f406a219d9e0791d8bcd8ca766ad47e9b5f63","isMergeCommit":false,"messageTitle":"Update Developer Guide and fix minor mistakes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":43}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ecf1b6d1a3403397e593d7219076b28ccaedf131","isMergeCommit":true,"messageTitle":"Merge pull request #34 from chiageng/branch-v1.1","messageBody":"Update AboutUs, User Guides and Developer Guide","fileTypesAndContributionMap":{}},{"hash":"0f9973b861864de5be8f23dcf578bcea5fbdb333","isMergeCommit":true,"messageTitle":"Merge pull request #31 from jamessinmaojun/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"6d18ea6233cde84df23dd9e4e6d782338c64c5fd","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp into branch-v1.1","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8c1ad56a7d3a43769043a6232604b8018ab911c0","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-v1.1\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c900b20f07834410568ca87b2df944e1c81638f9","isMergeCommit":true,"messageTitle":"Merge pull request #36 from Joshy837/master","messageBody":"Fix Joshua\u0027s Issues for V1.1","fileTypesAndContributionMap":{}},{"hash":"19b9f76fda0a5524aa5a1de6d89eba2c97ff06f0","isMergeCommit":true,"messageTitle":"Merge pull request #37 from jamessinmaojun/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"0a95734a867cd7a8aa4283da71b8b6f540383772","isMergeCommit":true,"messageTitle":"Merge pull request #35 from jannaleong/UpdateAboutUs_UG_DG","messageBody":"Update about us ug dg","fileTypesAndContributionMap":{}},{"hash":"d5585801fb7d45b88a30ff12a9bc63505d4d5bad","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"90567398bf81518b3c54e6064273d40b94bb747f","isMergeCommit":true,"messageTitle":"Merge pull request #38 from jannaleong/UpdateAboutUs_UG_DG","messageBody":"Fix formatting issues in dg","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"ee0ae6eff0f622e2e92637ce6a04741cc8c16d7f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"aa00dd0c2e6dae7cce9b833cdfeddf3d4bebe39c","isMergeCommit":false,"messageTitle":"Fix AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"de4cd18c87fd0a2cf0a085f6697ae9f69a46a6c0","isMergeCommit":true,"messageTitle":"Merge pull request #46 from chiageng/branch-fix-portfolio","messageBody":"Fix AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"4924a345fc4c51987b443e42659f48f8fb454cba","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":58}}},{"hash":"da3356e211ae6669db8e7326eab6e7e4a20c93ed","isMergeCommit":true,"messageTitle":"Merge pull request #47 from chiageng/branch-fix-portfolio","messageBody":"Fix _config.yml and Update UserGuide.md","fileTypesAndContributionMap":{}}]}],"jamessinmaojun":[{"date":"2024-02-29","commitResults":[{"hash":"6f9b1109117a980007ea1ba7c145cec05687552a","isMergeCommit":false,"messageTitle":"Update James Sin\u0027s Info for AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"9f4c7d68911725985805a89390dce4355343ebf1","isMergeCommit":false,"messageTitle":"Create jamessinmaojun.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":0}}},{"hash":"84698158b446bc92404f95a2e64db344994d4bcc","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":23}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a28da82aec82722a8d9a35860b6d0d75a3f03a69","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Add glossary","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"0e256e6aa8c10564eaff21f4ec7a30c42a75d27d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Update glossary","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"cba4fded808b1e5cfb9012d909ea21f1cb610aa1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a4a632f051b72c57e018aacbea4814a4de68faf4","isMergeCommit":true,"messageTitle":"Merge pull request #45 from jamessinmaojun/branchAboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"jannaleong":[{"date":"2024-03-06","commitResults":[{"hash":"8d5b72795bc362fc0c4232fee81f32be64eb856b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp:\n Update Developer Guide and fix minor mistakes\n Update non functional requirements in developer guide\n Update use cases in developer guide\n Update developer guide on non functional requirements\n Add User Guide for feature add\n Update AboutUs.md and chiageng.md\n Update DeveloperGuide.md\n Update DeveloperGuide.md\n Update AboutUs.md\n Update yleeyilin.md\n Update yleeyilin.md\n Update use case for DG\n Add descriptions\n Revert \"Update user guide for edit command\"\n Specify new constraint\n Fix extra line\n Update user guide for edit command\n Update AboutUs.md\n Update index.md\n Update README.md\n","fileTypesAndContributionMap":{}},{"hash":"0772456a20185d3c5e425333d4043748ad09e2c8","isMergeCommit":false,"messageTitle":"Update aboutus, dg and ug","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":23}}},{"hash":"4f1d904a8ea79888560366103327bed8a8787785","isMergeCommit":false,"messageTitle":"Fix ubuntu build failure","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":19}}},{"hash":"e891563423723798ec7b2399e5001b329a4b3810","isMergeCommit":false,"messageTitle":"Fix build ubuntu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"49bb2d38eb92f24beda35ffd6795faf62caec06f","isMergeCommit":false,"messageTitle":"Fix formatting issues in dg","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"0bb32628b667696d794118280f62bd096249ccef","isMergeCommit":false,"messageTitle":"Add more user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"aae79403e444e0f1358e9331cd4911edcf661d77","isMergeCommit":true,"messageTitle":"Merge pull request #42 from jannaleong/UpdateMoreUsecases","messageBody":"Add more user stories","fileTypesAndContributionMap":{}}]}],"yleeyilin":[{"date":"2024-02-28","commitResults":[{"hash":"513e1e7f53d2d120abc6b8f507957691d1252b14","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"62061f70307ee501af14d5cad43bff53a70315f4","isMergeCommit":false,"messageTitle":"Update user guide for edit command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":3}}},{"hash":"9271fdd4fbcb869cf5fc222e4f08bd880151599b","isMergeCommit":false,"messageTitle":"Fix extra line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"c2c9ba82b2aa6ae5ae7f56563099b5d568ef5934","isMergeCommit":false,"messageTitle":"Specify new constraint","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3d2abf6a8c3a7d2bc96d90904dd454ffa16f4e5c","isMergeCommit":false,"messageTitle":"Revert \"Update user guide for edit command\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":20}}},{"hash":"90aad7645a196caa6627e5c65b9582d7c59edcdb","isMergeCommit":true,"messageTitle":"Merge pull request #28 from AY2324S2-CS2103T-W10-2/revert-27-Update-UG-Edit-Command","messageBody":"Revert \"Update user guide for edit command\"","fileTypesAndContributionMap":{}},{"hash":"613dad4320429e6a970575653be02cfd7bee3ca2","isMergeCommit":false,"messageTitle":"Add descriptions","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"facd6d8cf4568105184d87df193a807bafa281d0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-UG-Edit-Command","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9759588f35a06c091ebf956d9a90c5a51276286e","isMergeCommit":true,"messageTitle":"Merge pull request #29 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update User Guide for Edit Command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"774d831795c694fc1b1fe5630347f8311fb97403","isMergeCommit":false,"messageTitle":"Update use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":197,"deletions":13}}},{"hash":"d9b8bf2c9e7f6a89317de3eeed40591aa78e2ce8","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"d67b158b565918ca1282632eadd6e13facefeacc","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":25}}},{"hash":"ea6d5c8730c5b5b1482f61c49b48b782c65cb83c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}},{"hash":"df138564ce343ade0bebd670d6c608e81048ab00","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":15}}},{"hash":"d1a38ffa8215cfd04f6aa62743f719f4fc197bf9","isMergeCommit":true,"messageTitle":"Merge pull request #26 from yleeyilin/Update-AboutUs-YiLin","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"fe5b4a72e017bdc44d58082f64f464a28129c6f0","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":42}}},{"hash":"5767e13c04cb8c8257a26e6698f85192624d0f80","isMergeCommit":true,"messageTitle":"Merge pull request #30 from yleeyilin/Update-DG-Use-Cases","messageBody":"Update use case for DG","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Joshy837":{"docs":70,"functional-code":0,"test-code":0},"chiageng":{"docs":119,"functional-code":0,"test-code":0},"jamessinmaojun":{"docs":42,"functional-code":0,"test-code":0,"other":1},"jannaleong":{"docs":54,"functional-code":0,"test-code":0},"yleeyilin":{"docs":193,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Joshy837":955.1021,"chiageng":2091.7756,"jamessinmaojun":323.78058,"jannaleong":1207.7805,"yleeyilin":7299.496},"authorDisplayNameMap":{"Joshy837":"CS2103T-W10-2 JOSH..UJUN","chiageng":"CS2103T-W10-2 CHNG..GENG","jamessinmaojun":"CS2103T-W10-2 JAME.. JUN","jannaleong":"CS2103T-W10-2 LEON..ANNA","yleeyilin":"CS2103T-W10-2 LEE .. LIN"}} +{"authorDailyContributionsMap":{"Joshy837":[{"date":"2024-02-28","commitResults":[{"hash":"83bd77e2c927eb71330a172350bbeb2c4354c520","isMergeCommit":true,"messageTitle":"Merge pull request #27 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update user guide for edit command","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"9362d7c59af2aef8085369da97a6270abd3c3de9","isMergeCommit":false,"messageTitle":"Update AboutUs for Joshua","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"45608234968e00d33d132bb89c73e7ecf3745051","isMergeCommit":false,"messageTitle":"Update the UG (Search command)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":0}}},{"hash":"a90cca88103979eb145814e1639f626c0e8935f6","isMergeCommit":false,"messageTitle":"Update Joshua\u0027s Portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":0}}},{"hash":"c7a6a283a990aade8825fa3bcf1b0b618e6f0c89","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":1}}},{"hash":"1c12015820507b4515cfbfb6762599d1201c3af4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Joshy837/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"745bcde05582028a1eee51b5842a21acbfe65f5e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"# Conflicts:\n#\tREADME.md\n","fileTypesAndContributionMap":{}},{"hash":"9dd49354fbfe26b3477ba26b2a60e2a25fa3ad0b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":1}}},{"hash":"3f5fe05599fcb7aa94b2164978d233843a79802a","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":14}}},{"hash":"5347523a871cef9c8c13559455f47b5b1d20f810","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Joshy837/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a42049c7b085a1522bef594f2c01401f1c18f660","isMergeCommit":true,"messageTitle":"Update README.md and fix merge conflict","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9991889b06b52e9eb91fe051c7c41bae11336b69","isMergeCommit":false,"messageTitle":"Remove all AB3 references","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"718471ce494c5c1591bb3f88f9f51b9cd609237f","isMergeCommit":true,"messageTitle":"Merge pull request #43 from Joshy837/branch-readme","messageBody":"","fileTypesAndContributionMap":{}}]}],"chiageng":[{"date":"2024-03-01","commitResults":[{"hash":"c9d32a2812847939a6e3b9481807385d0f8d68eb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"481d16a1dd2443288f46f447b8aa6faefa88fb98","isMergeCommit":false,"messageTitle":"Update AboutUs.md and chiageng.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":4}}},{"hash":"f012713ded2d80524e6fb8ca2dde135d0895b610","isMergeCommit":false,"messageTitle":"Add User Guide for feature add","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":22}}},{"hash":"054e6a41a3956961f5c0b130393882a8d82dca49","isMergeCommit":false,"messageTitle":"Update developer guide on non functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"3fec7d1e12a7d3d08cd37930b3c84aa878341e39","isMergeCommit":false,"messageTitle":"Update use cases in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":64,"deletions":0}}},{"hash":"e26c4db963811a434ee64222507e81f687482493","isMergeCommit":false,"messageTitle":"Update non functional requirements in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":0}}}]},{"date":"2024-03-02","commitResults":[{"hash":"129f406a219d9e0791d8bcd8ca766ad47e9b5f63","isMergeCommit":false,"messageTitle":"Update Developer Guide and fix minor mistakes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":43}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ecf1b6d1a3403397e593d7219076b28ccaedf131","isMergeCommit":true,"messageTitle":"Merge pull request #34 from chiageng/branch-v1.1","messageBody":"Update AboutUs, User Guides and Developer Guide","fileTypesAndContributionMap":{}},{"hash":"0f9973b861864de5be8f23dcf578bcea5fbdb333","isMergeCommit":true,"messageTitle":"Merge pull request #31 from jamessinmaojun/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"6d18ea6233cde84df23dd9e4e6d782338c64c5fd","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp into branch-v1.1","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8c1ad56a7d3a43769043a6232604b8018ab911c0","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-v1.1\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c900b20f07834410568ca87b2df944e1c81638f9","isMergeCommit":true,"messageTitle":"Merge pull request #36 from Joshy837/master","messageBody":"Fix Joshua\u0027s Issues for V1.1","fileTypesAndContributionMap":{}},{"hash":"19b9f76fda0a5524aa5a1de6d89eba2c97ff06f0","isMergeCommit":true,"messageTitle":"Merge pull request #37 from jamessinmaojun/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"0a95734a867cd7a8aa4283da71b8b6f540383772","isMergeCommit":true,"messageTitle":"Merge pull request #35 from jannaleong/UpdateAboutUs_UG_DG","messageBody":"Update about us ug dg","fileTypesAndContributionMap":{}},{"hash":"d5585801fb7d45b88a30ff12a9bc63505d4d5bad","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"90567398bf81518b3c54e6064273d40b94bb747f","isMergeCommit":true,"messageTitle":"Merge pull request #38 from jannaleong/UpdateAboutUs_UG_DG","messageBody":"Fix formatting issues in dg","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"ee0ae6eff0f622e2e92637ce6a04741cc8c16d7f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"aa00dd0c2e6dae7cce9b833cdfeddf3d4bebe39c","isMergeCommit":false,"messageTitle":"Fix AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"de4cd18c87fd0a2cf0a085f6697ae9f69a46a6c0","isMergeCommit":true,"messageTitle":"Merge pull request #46 from chiageng/branch-fix-portfolio","messageBody":"Fix AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"4924a345fc4c51987b443e42659f48f8fb454cba","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":58}}},{"hash":"da3356e211ae6669db8e7326eab6e7e4a20c93ed","isMergeCommit":true,"messageTitle":"Merge pull request #47 from chiageng/branch-fix-portfolio","messageBody":"Fix _config.yml and Update UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"175913f8c2f4f4791bfcfccf839cfbcd19f8f068","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e0259a1f0c290411db269623cb0da84c327be5d3","isMergeCommit":false,"messageTitle":"Update checking name to be case-insensitive","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1},"test-code":{"insertions":1,"deletions":1}}},{"hash":"b0bc00ee7413d2280ba715e8a4ebcaf2e79beba5","isMergeCommit":false,"messageTitle":"Update format of add command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":5,"deletions":5}}},{"hash":"776cd27a46ab2cb5c38f52ea5229d4e1ed7c4513","isMergeCommit":false,"messageTitle":"Insert staff instead of person in add command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":273,"deletions":34}}},{"hash":"0983cfdf012d9e43f62043b2ff638b2a94320ea7","isMergeCommit":false,"messageTitle":"Use /pooch-staff to add staff","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":150,"deletions":47}}},{"hash":"2d36837e36dd0e32343b8137fa365c5aee004bb3","isMergeCommit":false,"messageTitle":"Assign tag to Person and Staff","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":14,"deletions":11},"test-code":{"insertions":39,"deletions":39}}},{"hash":"91a782f9ceeec9233ffc38de4fe5c550806d0aa3","isMergeCommit":false,"messageTitle":"Add addsupplier command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":384,"deletions":10}}},{"hash":"ff8325f3cad90d74cf8802f8989170eb8eb46950","isMergeCommit":false,"messageTitle":"Add addmaintainer command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":391,"deletions":4}}}]},{"date":"2024-03-09","commitResults":[{"hash":"57c41fa71b5fbefbc4605a88616191e9371e1b44","isMergeCommit":false,"messageTitle":"Update JSON serialization for staff, supplier and maintainer, then update UI display for staff, supplier and maintainer","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":235,"deletions":11},"test-code":{"insertions":19,"deletions":10}}},{"hash":"3e62a38d7ac6e0f7699c3cf76a56cbffae886bd6","isMergeCommit":false,"messageTitle":"Fix checkstyles","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":155,"deletions":110},"test-code":{"insertions":53,"deletions":43}}},{"hash":"3490db11da24434d2b999ef8db95e5678a4eb0c5","isMergeCommit":false,"messageTitle":"Update chiageng.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":2}}},{"hash":"5f61f1d50537fcf33c8c4332402a44ece12746a9","isMergeCommit":false,"messageTitle":"Create Testing for AddStaffCommand","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":344,"deletions":0}}},{"hash":"a13e7e531dbfecabb15af4dfafa1c5a5664c4f07","isMergeCommit":false,"messageTitle":"Create Testing for AddSupplierCommand","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":363,"deletions":19}}},{"hash":"38cfc312fd3e96e56a4a4b58e24c34f36e51bae5","isMergeCommit":false,"messageTitle":"Update ParserUtilTest.java","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":156,"deletions":1}}},{"hash":"ee1ba89e8838e829f2a788e3fe4ce9b18c668337","isMergeCommit":false,"messageTitle":"Update JsonAdapterPersonTest.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":7},"test-code":{"insertions":64,"deletions":0}}},{"hash":"3a28c0e881913e16723a4dc8e0999c80d95c898b","isMergeCommit":false,"messageTitle":"Create AddMaintainerCommand Testing","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":400,"deletions":5}}},{"hash":"c7af968762c59496cc36847d64eb32e2b99728e9","isMergeCommit":false,"messageTitle":"Create AddStaffCommandParser.java testing","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":294,"deletions":12}}},{"hash":"f29fda1a1da3bb5fe45977a5729e5c04210be950","isMergeCommit":false,"messageTitle":"Create AddSupplierCommandParser and AddMaintainerCommandParser testing","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":458,"deletions":2}}},{"hash":"d255ded1d81768a4f377318e123b2d1e3157bf61","isMergeCommit":false,"messageTitle":"Create Unit Testing for Commission, Employment, Salary, Price, Skill, Product","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":0},"test-code":{"insertions":343,"deletions":0}}},{"hash":"44703bbdb9ab1e836571a99f0624fcee1170205d","isMergeCommit":false,"messageTitle":"Create Unit Testing for Maintainer, Staff and Supplier","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":18,"deletions":3},"test-code":{"insertions":321,"deletions":0}}},{"hash":"01aaa0603d740fa34ab3a8a0400e61c2f872a00c","isMergeCommit":false,"messageTitle":"Update AddressBookParser testing","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":113,"deletions":0}}}]}],"jamessinmaojun":[{"date":"2024-02-29","commitResults":[{"hash":"6f9b1109117a980007ea1ba7c145cec05687552a","isMergeCommit":false,"messageTitle":"Update James Sin\u0027s Info for AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"9f4c7d68911725985805a89390dce4355343ebf1","isMergeCommit":false,"messageTitle":"Create jamessinmaojun.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":0}}},{"hash":"84698158b446bc92404f95a2e64db344994d4bcc","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":23}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a28da82aec82722a8d9a35860b6d0d75a3f03a69","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Add glossary","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"0e256e6aa8c10564eaff21f4ec7a30c42a75d27d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Update glossary","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"cba4fded808b1e5cfb9012d909ea21f1cb610aa1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a4a632f051b72c57e018aacbea4814a4de68faf4","isMergeCommit":true,"messageTitle":"Merge pull request #45 from jamessinmaojun/branchAboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"jannaleong":[{"date":"2024-03-06","commitResults":[{"hash":"8d5b72795bc362fc0c4232fee81f32be64eb856b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp:\n Update Developer Guide and fix minor mistakes\n Update non functional requirements in developer guide\n Update use cases in developer guide\n Update developer guide on non functional requirements\n Add User Guide for feature add\n Update AboutUs.md and chiageng.md\n Update DeveloperGuide.md\n Update DeveloperGuide.md\n Update AboutUs.md\n Update yleeyilin.md\n Update yleeyilin.md\n Update use case for DG\n Add descriptions\n Revert \"Update user guide for edit command\"\n Specify new constraint\n Fix extra line\n Update user guide for edit command\n Update AboutUs.md\n Update index.md\n Update README.md\n","fileTypesAndContributionMap":{}},{"hash":"0772456a20185d3c5e425333d4043748ad09e2c8","isMergeCommit":false,"messageTitle":"Update aboutus, dg and ug","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":23}}},{"hash":"4f1d904a8ea79888560366103327bed8a8787785","isMergeCommit":false,"messageTitle":"Fix ubuntu build failure","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":19}}},{"hash":"e891563423723798ec7b2399e5001b329a4b3810","isMergeCommit":false,"messageTitle":"Fix build ubuntu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"49bb2d38eb92f24beda35ffd6795faf62caec06f","isMergeCommit":false,"messageTitle":"Fix formatting issues in dg","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"0bb32628b667696d794118280f62bd096249ccef","isMergeCommit":false,"messageTitle":"Add more user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"aae79403e444e0f1358e9331cd4911edcf661d77","isMergeCommit":true,"messageTitle":"Merge pull request #42 from jannaleong/UpdateMoreUsecases","messageBody":"Add more user stories","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"5869c21d2abf3e535858e3fc33a42142461d4ab9","isMergeCommit":true,"messageTitle":"Merge pull request #57 from chiageng/branch-addCommand","messageBody":"Create Add Command and Create Serialization to store different JSON objects","fileTypesAndContributionMap":{}}]}],"yleeyilin":[{"date":"2024-02-28","commitResults":[{"hash":"513e1e7f53d2d120abc6b8f507957691d1252b14","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"62061f70307ee501af14d5cad43bff53a70315f4","isMergeCommit":false,"messageTitle":"Update user guide for edit command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":3}}},{"hash":"9271fdd4fbcb869cf5fc222e4f08bd880151599b","isMergeCommit":false,"messageTitle":"Fix extra line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"c2c9ba82b2aa6ae5ae7f56563099b5d568ef5934","isMergeCommit":false,"messageTitle":"Specify new constraint","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3d2abf6a8c3a7d2bc96d90904dd454ffa16f4e5c","isMergeCommit":false,"messageTitle":"Revert \"Update user guide for edit command\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":20}}},{"hash":"90aad7645a196caa6627e5c65b9582d7c59edcdb","isMergeCommit":true,"messageTitle":"Merge pull request #28 from AY2324S2-CS2103T-W10-2/revert-27-Update-UG-Edit-Command","messageBody":"Revert \"Update user guide for edit command\"","fileTypesAndContributionMap":{}},{"hash":"613dad4320429e6a970575653be02cfd7bee3ca2","isMergeCommit":false,"messageTitle":"Add descriptions","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"facd6d8cf4568105184d87df193a807bafa281d0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-UG-Edit-Command","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9759588f35a06c091ebf956d9a90c5a51276286e","isMergeCommit":true,"messageTitle":"Merge pull request #29 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update User Guide for Edit Command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"774d831795c694fc1b1fe5630347f8311fb97403","isMergeCommit":false,"messageTitle":"Update use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":197,"deletions":13}}},{"hash":"d9b8bf2c9e7f6a89317de3eeed40591aa78e2ce8","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"d67b158b565918ca1282632eadd6e13facefeacc","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":25}}},{"hash":"ea6d5c8730c5b5b1482f61c49b48b782c65cb83c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}},{"hash":"df138564ce343ade0bebd670d6c608e81048ab00","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":15}}},{"hash":"d1a38ffa8215cfd04f6aa62743f719f4fc197bf9","isMergeCommit":true,"messageTitle":"Merge pull request #26 from yleeyilin/Update-AboutUs-YiLin","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"fe5b4a72e017bdc44d58082f64f464a28129c6f0","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":42}}},{"hash":"5767e13c04cb8c8257a26e6698f85192624d0f80","isMergeCommit":true,"messageTitle":"Merge pull request #30 from yleeyilin/Update-DG-Use-Cases","messageBody":"Update use case for DG","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Joshy837":{"docs":70,"functional-code":0,"test-code":0},"chiageng":{"docs":131,"functional-code":1415,"test-code":2872},"jamessinmaojun":{"docs":42,"functional-code":0,"test-code":0,"other":1},"jannaleong":{"docs":54,"functional-code":0,"test-code":0},"yleeyilin":{"docs":193,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Joshy837":797.23193,"chiageng":777270.0,"jamessinmaojun":271.7509,"jannaleong":1012.45667,"yleeyilin":6150.3667},"authorDisplayNameMap":{"Joshy837":"CS2103T-W10-2 JOSH..UJUN","chiageng":"CS2103T-W10-2 CHNG..GENG","jamessinmaojun":"CS2103T-W10-2 JAME.. JUN","jannaleong":"CS2103T-W10-2 LEON..ANNA","yleeyilin":"CS2103T-W10-2 LEE .. LIN"}} diff --git a/AY2324S2-CS2103T-W10-3_tp_master/authorship.json b/AY2324S2-CS2103T-W10-3_tp_master/authorship.json index 328bd7c5..57848b0f 100644 --- a/AY2324S2-CS2103T-W10-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W10-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-3/tp/actions)","lastModifiedDate":"2024-02-19"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp/graph/badge.svg?token\u003dPXSE5NPSA4)](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"![Ui.png](docs%2Fimages%2FUi.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"# PedagoguePages","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"\u003e \"Building Bridges, Bridging Gaps: PedagoguePages, Your Contact Map\"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"## What is PedagoguePages?","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"* `PedagoguePages` (`PePes` for short) is a **contact management application**.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"* Naming:","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":" * Product Name:","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":" * `Pedagogue` - Pedagogy, education.","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":" * `Pages` - Lists of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":" * Together, forming a contact list for educators!","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":" * Catchy abbreviation:","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":" * `Pe` from Pedagogue, and `Pes` from pages (`PAY-ge-S`)","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is a **Command Line Interface** (CLI) based system.","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages for?","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is optimized for **Educators**, specifically in the primary / secondary school area, where class sizes are large.\u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is more optimized for users who are:","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"ongzhili"},"content":" * Generally faster typists","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"ongzhili"},"content":" * Users that prefer command line interfaces","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages boasts features such as:","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"ongzhili"},"content":" * Basic **Create, Read, Update, Delete (CRUD)** operations on student contact information.","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"ongzhili"},"content":" * Search functionality based on different modes (e.g classes, student ID, etc)","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages based on?","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is also our (CS2103-W10-3\u0027s) brownfield development project, based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ongzhili":29,"wallacexuhanxiao":1,"-":9}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"J-wang-CSMA"},"content":"### Jeremy Wang","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"J-wang-CSMA"},"content":"\u003cimg src\u003d\"images/j-wang-csma.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"J-wang-CSMA"},"content":"[[github](http://github.com/J-wang-CSMA)]","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"J-wang-CSMA"},"content":"[[portfolio](team/j-wang-csma.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"J-wang-CSMA"},"content":"* Role: Developer, Deliverables and deadlines","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"J-wang-CSMA"},"content":"* Responsibilities: Data + UI","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"wallacexuhanxiao"},"content":"### XU HANXIAO","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"wallacexuhanxiao"},"content":"\u003cimg src\u003d\"images/wallacexuhanxiao.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"wallacexuhanxiao"},"content":"[[github](http://github.com/wallacexuhanxiao)]","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"wallacexuhanxiao"},"content":"[[portfolio](team/wallacexuhanxiao.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"wallacexuhanxiao"},"content":"* Responsibilities: Develop","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ongzhili"},"content":"### Ong Zhi Li","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"ongzhili"},"content":"\u003cimg src\u003d\"images/ongzhili.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"ongzhili"},"content":"[[github](http://github.com/ongzhili)]","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"ongzhili"},"content":"[[portfolio](team/ongzhili.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"ongzhili"},"content":"* Responsibilities: UI + Logic handling","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"IamZhenHong"},"content":"### Seng Zhen Hong","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"IamZhenHong"},"content":"\u003cimg src\u003d\"images/iamzhenhong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"IamZhenHong"},"content":"[[github](http://github.com/IamZhenHong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"IamZhenHong"},"content":"[[portfolio](team/iamzhenhong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"wallacexuhanxiao"},"content":"* Responsibilities: Develop","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"wallacexuhanxiao"},"content":"* ","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"IamZhenHong":4,"wallacexuhanxiao":7,"ongzhili":5,"-":28,"J-wang-CSMA":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"wallacexuhanxiao"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"wallacexuhanxiao"},"content":"* is an educator working with the education of primary / secondary students ","lastModifiedDate":"2024-02-28"},{"lineNumber":265,"author":{"gitId":"wallacexuhanxiao"},"content":"* require fast and organized access to students\u0027 and parents\u0027 contact detail ","lastModifiedDate":"2024-02-28"},{"lineNumber":266,"author":{"gitId":"wallacexuhanxiao"},"content":"* have many students\u0027 information to manage ","lastModifiedDate":"2024-02-28"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"wallacexuhanxiao"},"content":"**Value proposition**: Provide fast and organized access to students’ and parents’ contact details for the educator across multiple classes with large class sizes.","lastModifiedDate":"2024-02-28"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | view student and his/her parents’ contact records fully | contact them when needed. |","lastModifiedDate":"2024-02-28"},{"lineNumber":283,"author":{"gitId":"wallacexuhanxiao"},"content":"|`* * *` | teacher | easily update students’ contact records via their ID |track students’ latest contact information|","lastModifiedDate":"2024-02-28"},{"lineNumber":284,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | delete student contact records | remove unnecessary data when a student graduates / drops out |","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | easily identify duplicate entries | make sure there is no repetition of student records|","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | tag my students | find them easily|","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | administrator | delete all student info in one go| delete the whole class in one command after each semester|","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | expert teacher user | search for students by tags | view each class/CCA/tutoring group I am in charge of at a glance |","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by name | find specific student\u0027s information by their name |","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by id | find specific students by their unique student id |","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | busy teacher (teaching multiple subjects at once) | obtain class lists per class easily||","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | view my class roster at a glance| |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careful teacher | back up my students’ information| avoid losing any student\u0027s information|","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | school staff member |export contact lists for emergency purposes| ensure student safety in case of emergencies |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careless (but fast typing) teacher | run the command with some minor typo | use the application with greater ease|","lastModifiedDate":"2024-02-28"},{"lineNumber":296,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *`| forgetful teacher | add notes or additional information to each student | remember important details about them |","lastModifiedDate":"2024-02-28"},{"lineNumber":297,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | careless teacher | undo my previous command | avoid making mistake like delete the wrong student | ","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | mark students’ attendance for each class session| |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | set reminders for events such as parent-teacher/student-teacher meetings| I don\u0027t miss any important appointments|","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | teacher | utilize the application to understand the geographic distribution of my students | planning school trips or outreach programs |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"wallacexuhanxiao"},"content":"(For all use cases below, the **System** is the `PedagoguePages` and the **Actor** is the `teacher`, unless specified otherwise)","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the usage help list**","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view the user guide of PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows the user guide to teacher","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the student list**","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view all the info in PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of students\u0027 info","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":333,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to delete a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages deletes the person","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":352,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher enter the student info","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a success message and add the student\u0027s info","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. Teacher enter a invalid command.","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message and give a hint.","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":365,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":366,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":368,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Update the info of a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":369,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":370,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":371,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":372,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":373,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":374,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to update the info of a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":375,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages update the info for the student","lastModifiedDate":"2024-02-28"},{"lineNumber":376,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":387,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":390,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":391,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3b. The updated field is in a wrong format","lastModifiedDate":"2024-02-28"},{"lineNumber":392,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3b1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a group of a students by tag**","lastModifiedDate":"2024-02-28"},{"lineNumber":397,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":398,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":399,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":400,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a group of students by specific tag","lastModifiedDate":"2024-02-28"},{"lineNumber":401,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":402,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":403,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":404,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":405,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The tag is invalid","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a specific student by name**","lastModifiedDate":"2024-02-28"},{"lineNumber":413,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":414,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":415,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":416,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by student\u0027s name","lastModifiedDate":"2024-02-28"},{"lineNumber":417,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":418,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher select the student from the list","lastModifiedDate":"2024-02-28"},{"lineNumber":419,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":420,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":421,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":422,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":423,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":424,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":425,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":426,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":439,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wallacexuhanxiao":112,"-":380}},{"path":"docs/team/iamzhenhong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"IamZhenHong"},"content":"# zhen hong \u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"IamZhenHong":1}},{"path":"docs/team/j-wang-csma.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"J-wang-CSMA"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"J-wang-CSMA"},"content":"title: Jeremy Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"J-wang-CSMA"},"content":"### Project: PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"J-wang-CSMA"},"content":"PedagoguePages is a desktop address book application for teachers to manage their students\u0027 contact information.","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"J-wang-CSMA"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"J-wang-CSMA"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"J-wang-CSMA"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"J-wang-CSMA"},"content":"* **New Features**: ","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"J-wang-CSMA"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"J-wang-CSMA"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"J-wang-CSMA"},"content":" * Managed releases: ","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"J-wang-CSMA"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"J-wang-CSMA"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"J-wang-CSMA"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"J-wang-CSMA"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"J-wang-CSMA"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"J-wang-CSMA"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"J-wang-CSMA":37}},{"path":"docs/team/ongzhili.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"ongzhili"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"ongzhili"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"ongzhili"},"content":"### Project: PedagogyPages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"PedagogyPages is a desktop address book","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"application used for teachers to manage their students\u0027 contact information. ","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX. ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":" * Updated AboutUs with own information","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":" * Added portfolio file (this file)","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"ongzhili":20}},{"path":"docs/team/wallacexuhanxiao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wallacexuhanxiao"},"content":"# Hanxiao\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"wallacexuhanxiao":1}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-3/tp/actions)","lastModifiedDate":"2024-02-19"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp/graph/badge.svg?token\u003dPXSE5NPSA4)](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"![Ui.png](docs%2Fimages%2FUi.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"# PedagoguePages","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"\u003e \"Building Bridges, Bridging Gaps: PedagoguePages, Your Contact Map\"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"## What is PedagoguePages?","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"* `PedagoguePages` (`PePes` for short) is a **contact management application**.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"* Naming:","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":" * Product Name:","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":" * `Pedagogue` - Pedagogy, education.","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":" * `Pages` - Lists of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":" * Together, forming a contact list for educators!","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":" * Catchy abbreviation:","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":" * `Pe` from Pedagogue, and `Pes` from pages (`PAY-ge-S`)","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is a **Command Line Interface** (CLI) based system.","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages for?","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is optimized for **Educators**, specifically in the primary / secondary school area, where class sizes are large.\u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is more optimized for users who are:","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"ongzhili"},"content":" * Generally faster typists","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"ongzhili"},"content":" * Users that prefer command line interfaces","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages boasts features such as:","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"ongzhili"},"content":" * Basic **Create, Read, Update, Delete (CRUD)** operations on student contact information.","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"ongzhili"},"content":" * Search functionality based on different modes (e.g classes, student ID, etc)","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages based on?","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is also our (CS2103-W10-3\u0027s) brownfield development project, based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ongzhili":29,"wallacexuhanxiao":1,"-":9}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"J-wang-CSMA"},"content":"### Jeremy Wang","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"J-wang-CSMA"},"content":"\u003cimg src\u003d\"images/j-wang-csma.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"J-wang-CSMA"},"content":"[[github](http://github.com/J-wang-CSMA)]","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"J-wang-CSMA"},"content":"[[portfolio](team/j-wang-csma.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"J-wang-CSMA"},"content":"* Role: Developer, Deliverables and deadlines","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"J-wang-CSMA"},"content":"* Responsibilities: Data + UI","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"wallacexuhanxiao"},"content":"### XU HANXIAO","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"wallacexuhanxiao"},"content":"\u003cimg src\u003d\"images/wallacexuhanxiao.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"wallacexuhanxiao"},"content":"[[github](http://github.com/wallacexuhanxiao)]","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"wallacexuhanxiao"},"content":"[[portfolio](team/wallacexuhanxiao.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"wallacexuhanxiao"},"content":"* Responsibilities: Develop","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ongzhili"},"content":"### Ong Zhi Li","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"ongzhili"},"content":"\u003cimg src\u003d\"images/ongzhili.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"ongzhili"},"content":"[[github](http://github.com/ongzhili)]","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"ongzhili"},"content":"[[portfolio](team/ongzhili.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"ongzhili"},"content":"* Responsibilities: UI + Logic handling","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"IamZhenHong"},"content":"### Seng Zhen Hong","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"IamZhenHong"},"content":"\u003cimg src\u003d\"images/iamzhenhong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"IamZhenHong"},"content":"[[github](http://github.com/IamZhenHong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"IamZhenHong"},"content":"[[portfolio](team/iamzhenhong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"wallacexuhanxiao"},"content":"* Responsibilities: Develop","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"wallacexuhanxiao"},"content":"* ","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"IamZhenHong":4,"wallacexuhanxiao":7,"ongzhili":5,"-":28,"J-wang-CSMA":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"wallacexuhanxiao"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"wallacexuhanxiao"},"content":"* is an educator working with the education of primary / secondary students ","lastModifiedDate":"2024-02-28"},{"lineNumber":265,"author":{"gitId":"wallacexuhanxiao"},"content":"* require fast and organized access to students\u0027 and parents\u0027 contact detail ","lastModifiedDate":"2024-02-28"},{"lineNumber":266,"author":{"gitId":"wallacexuhanxiao"},"content":"* have many students\u0027 information to manage ","lastModifiedDate":"2024-02-28"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"wallacexuhanxiao"},"content":"**Value proposition**: Provide fast and organized access to students’ and parents’ contact details for the educator across multiple classes with large class sizes.","lastModifiedDate":"2024-02-28"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | view student and his/her parents’ contact records fully | contact them when needed. |","lastModifiedDate":"2024-02-28"},{"lineNumber":283,"author":{"gitId":"wallacexuhanxiao"},"content":"|`* * *` | teacher | easily update students’ contact records via their ID |track students’ latest contact information|","lastModifiedDate":"2024-02-28"},{"lineNumber":284,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | delete student contact records | remove unnecessary data when a student graduates / drops out |","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | easily identify duplicate entries | make sure there is no repetition of student records|","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | tag my students | find them easily|","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | administrator | delete all student info in one go| delete the whole class in one command after each semester|","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | expert teacher user | search for students by tags | view each class/CCA/tutoring group I am in charge of at a glance |","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by name | find specific student\u0027s information by their name |","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by id | find specific students by their unique student id |","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | busy teacher (teaching multiple subjects at once) | obtain class lists per class easily||","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | view my class roster at a glance| |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careful teacher | back up my students’ information| avoid losing any student\u0027s information|","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | school staff member |export contact lists for emergency purposes| ensure student safety in case of emergencies |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careless (but fast typing) teacher | run the command with some minor typo | use the application with greater ease|","lastModifiedDate":"2024-02-28"},{"lineNumber":296,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *`| forgetful teacher | add notes or additional information to each student | remember important details about them |","lastModifiedDate":"2024-02-28"},{"lineNumber":297,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | careless teacher | undo my previous command | avoid making mistake like delete the wrong student | ","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | mark students’ attendance for each class session| |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | set reminders for events such as parent-teacher/student-teacher meetings| I don\u0027t miss any important appointments|","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | teacher | utilize the application to understand the geographic distribution of my students | planning school trips or outreach programs |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"wallacexuhanxiao"},"content":"(For all use cases below, the **System** is the `PedagoguePages` and the **Actor** is the `teacher`, unless specified otherwise)","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the usage help list**","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view the user guide of PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows the user guide to teacher","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the student list**","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view all the info in PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of students\u0027 info","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":333,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to delete a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages deletes the person","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":352,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher enter the student info","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a success message and add the student\u0027s info","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. Teacher enter a invalid command.","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message and give a hint.","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":365,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":366,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":368,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Update the info of a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":369,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":370,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":371,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":372,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":373,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":374,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to update the info of a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":375,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages update the info for the student","lastModifiedDate":"2024-02-28"},{"lineNumber":376,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":387,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":390,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":391,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3b. The updated field is in a wrong format","lastModifiedDate":"2024-02-28"},{"lineNumber":392,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3b1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a group of a students by tag**","lastModifiedDate":"2024-02-28"},{"lineNumber":397,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":398,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":399,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":400,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a group of students by specific tag","lastModifiedDate":"2024-02-28"},{"lineNumber":401,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":402,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":403,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":404,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":405,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The tag is invalid","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a specific student by name**","lastModifiedDate":"2024-02-28"},{"lineNumber":413,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":414,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":415,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":416,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by student\u0027s name","lastModifiedDate":"2024-02-28"},{"lineNumber":417,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":418,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher select the student from the list","lastModifiedDate":"2024-02-28"},{"lineNumber":419,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":420,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":421,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":422,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":423,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":424,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":425,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":426,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"wallacexuhanxiao"},"content":"4. The system should respond all request within 1 minute.","lastModifiedDate":"2024-03-10"},{"lineNumber":434,"author":{"gitId":"wallacexuhanxiao"},"content":"5. Should not take more than 500 MB memory while running.","lastModifiedDate":"2024-03-10"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":440,"author":{"gitId":"IamZhenHong"},"content":"* **PedadoguePages**: The name of the application","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"IamZhenHong"},"content":"* **Student_id**: Each students\u0027 unique identifier","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"wallacexuhanxiao"},"content":"* **MB**: Mega Bytes","lastModifiedDate":"2024-03-10"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"IamZhenHong":2,"wallacexuhanxiao":115,"-":378}},{"path":"docs/team/iamzhenhong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"IamZhenHong"},"content":"# zhen hong \u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"IamZhenHong":1}},{"path":"docs/team/j-wang-csma.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"J-wang-CSMA"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"J-wang-CSMA"},"content":"title: Jeremy Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"J-wang-CSMA"},"content":"### Project: PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"J-wang-CSMA"},"content":"PedagoguePages is a desktop address book application for teachers to manage their students\u0027 contact information.","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"J-wang-CSMA"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"J-wang-CSMA"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"J-wang-CSMA"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"J-wang-CSMA"},"content":"* **New Features**: ","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"J-wang-CSMA"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"J-wang-CSMA"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"J-wang-CSMA"},"content":" * Managed releases: ","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"J-wang-CSMA"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"J-wang-CSMA"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"J-wang-CSMA"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"J-wang-CSMA"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"J-wang-CSMA"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"J-wang-CSMA"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"J-wang-CSMA":37}},{"path":"docs/team/ongzhili.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"ongzhili"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"ongzhili"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"ongzhili"},"content":"### Project: PedagogyPages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"PedagogyPages is a desktop address book","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"application used for teachers to manage their students\u0027 contact information. ","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX. ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":" * Updated AboutUs with own information","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":" * Added portfolio file (this file)","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"ongzhili":20}},{"path":"docs/team/wallacexuhanxiao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wallacexuhanxiao"},"content":"# Hanxiao\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"wallacexuhanxiao":1}}] diff --git a/AY2324S2-CS2103T-W10-3_tp_master/commits.json b/AY2324S2-CS2103T-W10-3_tp_master/commits.json index 9f7b730d..8fb082f9 100644 --- a/AY2324S2-CS2103T-W10-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"IamZhenHong":[{"date":"2024-03-07","commitResults":[{"hash":"6c03658084af0e8f0dd45447382129947931c609","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":0}}},{"hash":"92f4e27d22a1d3538509fa7c939f7fdc34498503","isMergeCommit":true,"messageTitle":"Merge pull request #26 from IamZhenHong/Update-ZhenHong_AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}],"ongzhili":[{"date":"2024-02-28","commitResults":[{"hash":"9385799409105c26b28c56cef388d382521797e8","isMergeCommit":false,"messageTitle":"Update AboutUs and add portfolio document","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":14}}},{"hash":"0d4d8dde6bc98ef5b9f7aa17b474ce30744715d5","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-aboutus\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1cdca2a8236930177923a58a23db170bcbc34658","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-3/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b92aa4cf1a7fa10d192874fa2ac256960bd5de86","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ongzhili/master","messageBody":"Update Zhi Li\u0027s information and add porfolio document","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"02d00ce9d38c44b1adc0de95ab432b7302f15c4c","isMergeCommit":false,"messageTitle":"Update Readme and Ui mockup","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":11}}},{"hash":"7dba2bd9811194cec98ef1fd9ce0833fad676a8a","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-readme\u0027","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"303c97cc2458edc8079556dc5cc01c9dd4395790","isMergeCommit":true,"messageTitle":"Merge pull request #18 from wallacexuhanxiao/tutorial-adding-command","messageBody":"Trival commit to fullfil the task","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"256a9a93e5475c7d2cbb7909d48b4c99addb2aa5","isMergeCommit":false,"messageTitle":"Update ongzhili.PNG filename and corresponding references","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"wallacexuhanxiao":[{"date":"2024-02-24","commitResults":[{"hash":"c9f7c4d577bee6bc5230f9e5123d6cf4a1c9ba1c","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-02-28","commitResults":[{"hash":"919ecb18046289168a7eaf90c02cc309261b679e","isMergeCommit":false,"messageTitle":"Update about us for Hanxiao","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"4e09887f7596159395ec7d397e1df70dd84dc7ab","isMergeCommit":false,"messageTitle":"Fix minor bug","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"14a7036a7cfd60bd09d7909e394ceeb83a4715f6","isMergeCommit":true,"messageTitle":"Merge branch \u0027Update-Hanxiao_AboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b4a351ff43dd7d1c15719dbd263a1dff03179eae","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wallacexuhanxiao/Update-Hanxiao_AboutUs","messageBody":"Update about us for Hanxiao","fileTypesAndContributionMap":{}},{"hash":"7296ae707a6d00ea992fc5fb17bb707e4fa7cfcd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W10-3:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ed843ebaa8031e8fddb0f5b79e4dedd96ddb905c","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":10}}},{"hash":"a62de54094445ca0bb6fd6bbb1ab57878a3c8e6f","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":9}}}]},{"date":"2024-03-04","commitResults":[{"hash":"26e9cbe6fde203eb0cadfa7e2c9bc010d337a048","isMergeCommit":false,"messageTitle":"Add extension on one of use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":1}}},{"hash":"210877125a8899c968f0feefa46e45ec780c1034","isMergeCommit":true,"messageTitle":"Merge pull request","messageBody":"Update user story and use case","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"d5d40cb05359c517c61ba677e2a7cbf6bfa6db0f","isMergeCommit":false,"messageTitle":"Trival commit to fullfil the task","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a87b8b983aacee0240f60c9d434f0c849e3d38fe","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"cbfde2c3e413724d73c55a6c2a5a0d4f3e933392","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ongzhili/master","messageBody":"Update README.md and Ui.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f957dced0a7cb777b2322bcfadb664f8a055f0ed","isMergeCommit":false,"messageTitle":"Some minor update on about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"93ba48f6c63def592ca8bc686c7d0b435b43c726","isMergeCommit":true,"messageTitle":"Merge pull request #21 from wallacexuhanxiao/Clear-AB3","messageBody":"Clear AB3 on the website","fileTypesAndContributionMap":{}},{"hash":"33b24443ad46b16ef14f70d2e21108e2d16458e6","isMergeCommit":true,"messageTitle":"Merge pull request #27 from ongzhili/ongzhili-image-renaming","messageBody":"Update ongzhili.PNG filename and corresponding references","fileTypesAndContributionMap":{}},{"hash":"f12928f714cd072675cf8838fbf3057933c25128","isMergeCommit":false,"messageTitle":"Delete john doe from about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":9}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c45b029d4c092923e7dfd07b006dde9b7b229460","isMergeCommit":true,"messageTitle":"Merge pull request #31 from wallacexuhanxiao/Clear-Placeholder-Text","messageBody":"Clear placeholder text in about us","fileTypesAndContributionMap":{}},{"hash":"dce400cf4062c5b882131e8ed84b759fb74a1d80","isMergeCommit":false,"messageTitle":"Fix minor bug in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"948814cba2d02fcc3ab661541d80b68d7338b347","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Add new line at EOF","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"d03a78a672d1b7005f259831dfad016037a94bc3","isMergeCommit":true,"messageTitle":"Merge pull request #33 from wallacexuhanxiao/Change-Aboutus","messageBody":"Fix minor bug in aboutus","fileTypesAndContributionMap":{}}]}],"J-wang-CSMA":[{"date":"2024-02-28","commitResults":[{"hash":"6904df26d33ff50f462fe6761cea38f33bced0ee","isMergeCommit":false,"messageTitle":"Edit AboutUs page and add relevant documents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":6}}},{"hash":"23c5fc971ff7b838b6ec07055f5931ea1b285465","isMergeCommit":false,"messageTitle":"Update project portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":10}}},{"hash":"e045d19f119c818d5d636c633b1d4e17b1ea998e","isMergeCommit":true,"messageTitle":"Merge pull request #8 from J-wang-CSMA/branch-AboutUsJeremy","messageBody":"Edit AboutUs page and add relevant documents for J-Wang-CSMA","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"IamZhenHong":{"docs":5,"functional-code":0,"test-code":0},"ongzhili":{"docs":54,"functional-code":0,"test-code":0},"wallacexuhanxiao":{"docs":121,"functional-code":0,"test-code":0},"J-wang-CSMA":{"docs":43,"functional-code":0,"test-code":0}},"authorContributionVariance":{"IamZhenHong":3.9822223,"ongzhili":198.62221,"wallacexuhanxiao":1403.9557,"J-wang-CSMA":296.2401},"authorDisplayNameMap":{"IamZhenHong":"CS2103T-W10-3 SENG..HONG","ongzhili":"CS2103T-W10-3 ONG ..I LI","wallacexuhanxiao":"CS2103T-W10-3 XU H..XIAO","J-wang-CSMA":"CS2103T-W10-3 WANG..REMY"}} +{"authorDailyContributionsMap":{"IamZhenHong":[{"date":"2024-03-07","commitResults":[{"hash":"6c03658084af0e8f0dd45447382129947931c609","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":0}}},{"hash":"70153128a94d6a73ea4d0694401041b2ff0bd2b1","isMergeCommit":false,"messageTitle":"Update NFRs and GLossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"92f4e27d22a1d3538509fa7c939f7fdc34498503","isMergeCommit":true,"messageTitle":"Merge pull request #26 from IamZhenHong/Update-ZhenHong_AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}],"ongzhili":[{"date":"2024-02-28","commitResults":[{"hash":"9385799409105c26b28c56cef388d382521797e8","isMergeCommit":false,"messageTitle":"Update AboutUs and add portfolio document","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":14}}},{"hash":"0d4d8dde6bc98ef5b9f7aa17b474ce30744715d5","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-aboutus\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1cdca2a8236930177923a58a23db170bcbc34658","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-3/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b92aa4cf1a7fa10d192874fa2ac256960bd5de86","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ongzhili/master","messageBody":"Update Zhi Li\u0027s information and add porfolio document","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"02d00ce9d38c44b1adc0de95ab432b7302f15c4c","isMergeCommit":false,"messageTitle":"Update Readme and Ui mockup","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":11}}},{"hash":"7dba2bd9811194cec98ef1fd9ce0833fad676a8a","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-readme\u0027","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"303c97cc2458edc8079556dc5cc01c9dd4395790","isMergeCommit":true,"messageTitle":"Merge pull request #18 from wallacexuhanxiao/tutorial-adding-command","messageBody":"Trival commit to fullfil the task","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"256a9a93e5475c7d2cbb7909d48b4c99addb2aa5","isMergeCommit":false,"messageTitle":"Update ongzhili.PNG filename and corresponding references","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"wallacexuhanxiao":[{"date":"2024-02-24","commitResults":[{"hash":"c9f7c4d577bee6bc5230f9e5123d6cf4a1c9ba1c","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-02-28","commitResults":[{"hash":"919ecb18046289168a7eaf90c02cc309261b679e","isMergeCommit":false,"messageTitle":"Update about us for Hanxiao","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"4e09887f7596159395ec7d397e1df70dd84dc7ab","isMergeCommit":false,"messageTitle":"Fix minor bug","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"14a7036a7cfd60bd09d7909e394ceeb83a4715f6","isMergeCommit":true,"messageTitle":"Merge branch \u0027Update-Hanxiao_AboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b4a351ff43dd7d1c15719dbd263a1dff03179eae","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wallacexuhanxiao/Update-Hanxiao_AboutUs","messageBody":"Update about us for Hanxiao","fileTypesAndContributionMap":{}},{"hash":"7296ae707a6d00ea992fc5fb17bb707e4fa7cfcd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W10-3:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ed843ebaa8031e8fddb0f5b79e4dedd96ddb905c","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":10}}},{"hash":"a62de54094445ca0bb6fd6bbb1ab57878a3c8e6f","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":9}}}]},{"date":"2024-03-04","commitResults":[{"hash":"26e9cbe6fde203eb0cadfa7e2c9bc010d337a048","isMergeCommit":false,"messageTitle":"Add extension on one of use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":1}}},{"hash":"210877125a8899c968f0feefa46e45ec780c1034","isMergeCommit":true,"messageTitle":"Merge pull request","messageBody":"Update user story and use case","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"d5d40cb05359c517c61ba677e2a7cbf6bfa6db0f","isMergeCommit":false,"messageTitle":"Trival commit to fullfil the task","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a87b8b983aacee0240f60c9d434f0c849e3d38fe","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"cbfde2c3e413724d73c55a6c2a5a0d4f3e933392","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ongzhili/master","messageBody":"Update README.md and Ui.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f957dced0a7cb777b2322bcfadb664f8a055f0ed","isMergeCommit":false,"messageTitle":"Some minor update on about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"93ba48f6c63def592ca8bc686c7d0b435b43c726","isMergeCommit":true,"messageTitle":"Merge pull request #21 from wallacexuhanxiao/Clear-AB3","messageBody":"Clear AB3 on the website","fileTypesAndContributionMap":{}},{"hash":"33b24443ad46b16ef14f70d2e21108e2d16458e6","isMergeCommit":true,"messageTitle":"Merge pull request #27 from ongzhili/ongzhili-image-renaming","messageBody":"Update ongzhili.PNG filename and corresponding references","fileTypesAndContributionMap":{}},{"hash":"f12928f714cd072675cf8838fbf3057933c25128","isMergeCommit":false,"messageTitle":"Delete john doe from about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":9}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c45b029d4c092923e7dfd07b006dde9b7b229460","isMergeCommit":true,"messageTitle":"Merge pull request #31 from wallacexuhanxiao/Clear-Placeholder-Text","messageBody":"Clear placeholder text in about us","fileTypesAndContributionMap":{}},{"hash":"dce400cf4062c5b882131e8ed84b759fb74a1d80","isMergeCommit":false,"messageTitle":"Fix minor bug in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"948814cba2d02fcc3ab661541d80b68d7338b347","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Add new line at EOF","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"d03a78a672d1b7005f259831dfad016037a94bc3","isMergeCommit":true,"messageTitle":"Merge pull request #33 from wallacexuhanxiao/Change-Aboutus","messageBody":"Fix minor bug in aboutus","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"57d5fcaff80e8d6cec8b0272df01ea7a86acaea6","isMergeCommit":true,"messageTitle":"Merge pull request #29 from IamZhenHong/Update-DG-NFRs_Glossary","messageBody":"Update NFRs and GLossary","fileTypesAndContributionMap":{}},{"hash":"8025e507935a29ee6744edd67245b393bf65680b","isMergeCommit":false,"messageTitle":"Updates two NFRs on developer guides","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":0}}},{"hash":"d348f3b0a227bcbbea19973d698af9dad7fe7901","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"5fdeafb475941db13a28569fb46f65b7317c4b56","isMergeCommit":true,"messageTitle":"Merge pull request #35 from wallacexuhanxiao/Update-NFRs","messageBody":"Update NFRs for developer guide","fileTypesAndContributionMap":{}}]}],"J-wang-CSMA":[{"date":"2024-02-28","commitResults":[{"hash":"6904df26d33ff50f462fe6761cea38f33bced0ee","isMergeCommit":false,"messageTitle":"Edit AboutUs page and add relevant documents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":6}}},{"hash":"23c5fc971ff7b838b6ec07055f5931ea1b285465","isMergeCommit":false,"messageTitle":"Update project portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":10}}},{"hash":"e045d19f119c818d5d636c633b1d4e17b1ea998e","isMergeCommit":true,"messageTitle":"Merge pull request #8 from J-wang-CSMA/branch-AboutUsJeremy","messageBody":"Edit AboutUs page and add relevant documents for J-Wang-CSMA","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"IamZhenHong":{"docs":7,"functional-code":0,"test-code":0},"ongzhili":{"docs":54,"functional-code":0,"test-code":0},"wallacexuhanxiao":{"docs":124,"functional-code":0,"test-code":0},"J-wang-CSMA":{"docs":43,"functional-code":0,"test-code":0}},"authorContributionVariance":{"IamZhenHong":6.6989627,"ongzhili":178.58824,"wallacexuhanxiao":1251.0659,"J-wang-CSMA":263.5848},"authorDisplayNameMap":{"IamZhenHong":"CS2103T-W10-3 SENG..HONG","ongzhili":"CS2103T-W10-3 ONG ..I LI","wallacexuhanxiao":"CS2103T-W10-3 XU H..XIAO","J-wang-CSMA":"CS2103T-W10-3 WANG..REMY"}} diff --git a/AY2324S2-CS2103T-W13-1_tp_master/authorship.json b/AY2324S2-CS2103T-W13-1_tp_master/authorship.json index 67a31509..57848375 100644 --- a/AY2324S2-CS2103T-W13-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W13-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kjw142857"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W13-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W13-1/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W13-1/tp/graph/badge.svg?token\u003dMZAGQZIFNS)](https://codecov.io/gh/AY2324S2-CS2103T-W13-1/tp)","lastModifiedDate":"2024-02-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kjw142857"},"content":"* This is **LoanGuard Pro, an application that helps business owners manage clients and their loan details**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"kjw142857"},"content":" * to keep track of the items you have loaned out","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kjw142857"},"content":" * to view your history of loans by client","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kjw142857"},"content":"* The project builds on an existing Address Book used for managing contact details, **adding in a loan tracker functionality**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kjw142857"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"* It is named `LoanGuard Pro` because it represents a more powerful version of an address book, that can also manage the loans of your contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kjw142857"},"content":"* For the detailed documentation of this project, see the **[LoanGuard Pro Product Website](https://ay2324s2-cs2103t-w13-1.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"kjw142857":9,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"kjw142857"},"content":"### Khor Jun Wei","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"\u003cimg src\u003d\"images/kjw142857.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"content":"[[github](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kjw142857"},"content":"[[portfolio](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kjw142857"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"kjw142857"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"marcus-ny"},"content":"### Kyal Sin Min Thet","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"marcus-ny"},"content":"\u003cimg src\u003d\"images/marcus-ny.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"marcus-ny"},"content":"[[github](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"marcus-ny"},"content":"[[portfolio](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Joseph31416"},"content":"### Teoh Tze Tzun","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Joseph31416"},"content":"\u003cimg src\u003d\"images/joseph31416.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Joseph31416"},"content":"[[github](https://github.com/Joseph31416)] [[portfolio](https://github.com/Joseph31416)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"narwhalsilent"},"content":"### Wang Junwu","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"narwhalsilent"},"content":"\u003cimg src\u003d\"images/narwhalsilent.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"narwhalsilent"},"content":"[[github](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"narwhalsilent"},"content":"[[portfolio](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"narwhalsilent"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"xiaorui-ui"},"content":"### Zhang Xiaorui","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"xiaorui-ui"},"content":"\u003cimg src\u003d\"images/xiaorui-ui.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"xiaorui-ui"},"content":"[[github](https://github.com/xiaorui-ui)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"xiaorui-ui"},"content":"[[portfolio](https://github.com/xiaorui-ui)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"xiaorui-ui"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"marcus-ny":6,"xiaorui-ui":5,"Joseph31416":3,"-":34,"kjw142857":6,"narwhalsilent":5}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"marcus-ny"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"marcus-ny"},"content":" original source as well}","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"marcus-ny"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":41,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"marcus-ny"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"marcus-ny"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"marcus-ny"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"marcus-ny"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"marcus-ny"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-07"},{"lineNumber":63,"author":{"gitId":"marcus-ny"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"marcus-ny"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"marcus-ny"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"marcus-ny"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-07"},{"lineNumber":74,"author":{"gitId":"marcus-ny"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-07"},{"lineNumber":75,"author":{"gitId":"marcus-ny"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-07"},{"lineNumber":76,"author":{"gitId":"marcus-ny"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":80,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"marcus-ny"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":85,"author":{"gitId":"marcus-ny"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"marcus-ny"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-07"},{"lineNumber":90,"author":{"gitId":"marcus-ny"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-07"},{"lineNumber":91,"author":{"gitId":"marcus-ny"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"marcus-ny"},"content":"visible GUI.","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"marcus-ny"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that","lastModifiedDate":"2024-03-07"},{"lineNumber":95,"author":{"gitId":"marcus-ny"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"marcus-ny"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":97,"author":{"gitId":"marcus-ny"},"content":"is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":98,"author":{"gitId":"marcus-ny"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-07"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"marcus-ny"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"marcus-ny"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"marcus-ny"},"content":"call as an example.","lastModifiedDate":"2024-03-07"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":122,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":126,"author":{"gitId":"marcus-ny"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates","lastModifiedDate":"2024-03-07"},{"lineNumber":127,"author":{"gitId":"marcus-ny"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"marcus-ny"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"marcus-ny"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":131,"author":{"gitId":"marcus-ny"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"marcus-ny"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":140,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"marcus-ny"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"marcus-ny"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"marcus-ny"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"marcus-ny"},"content":" a `Command` object.","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"marcus-ny"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"marcus-ny"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"marcus-ny"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":159,"author":{"gitId":"marcus-ny"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"marcus-ny"},"content":" is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"marcus-ny"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"marcus-ny"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"marcus-ny"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"marcus-ny"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"marcus-ny"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":169,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"marcus-ny"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"marcus-ny"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":183,"author":{"gitId":"marcus-ny"},"content":" objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"marcus-ny"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"marcus-ny"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"marcus-ny"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"marcus-ny"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"marcus-ny"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-07"},{"lineNumber":204,"author":{"gitId":"marcus-ny"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-07"},{"lineNumber":205,"author":{"gitId":"marcus-ny"},"content":"following operations:","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":208,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":209,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"marcus-ny"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":212,"author":{"gitId":"marcus-ny"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"marcus-ny"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-07"},{"lineNumber":217,"author":{"gitId":"marcus-ny"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-07"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"marcus-ny"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-07"},{"lineNumber":222,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"marcus-ny"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"marcus-ny"},"content":"state.","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"marcus-ny"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-07"},{"lineNumber":229,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-07"},{"lineNumber":230,"author":{"gitId":"marcus-ny"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"marcus-ny"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing","lastModifiedDate":"2024-03-07"},{"lineNumber":239,"author":{"gitId":"marcus-ny"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-07"},{"lineNumber":240,"author":{"gitId":"marcus-ny"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":259,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":261,"author":{"gitId":"marcus-ny"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-07"},{"lineNumber":262,"author":{"gitId":"marcus-ny"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"marcus-ny"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-07"},{"lineNumber":269,"author":{"gitId":"marcus-ny"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"marcus-ny"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"marcus-ny"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-07"},{"lineNumber":275,"author":{"gitId":"marcus-ny"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-07"},{"lineNumber":276,"author":{"gitId":"marcus-ny"},"content":"purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern","lastModifiedDate":"2024-03-07"},{"lineNumber":277,"author":{"gitId":"marcus-ny"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":310,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"marcus-ny"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"marcus-ny"},"content":"(For all use cases below, the **System** is the `LoanGuard Pro` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"marcus-ny"},"content":"otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC1 - Delete a contact","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"marcus-ny"},"content":"Precondition: `list` command shows a numbered list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"marcus-ny"},"content":"1. User requests to delete a contact, specifying the index.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"marcus-ny"},"content":"2. System deletes the contact from the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact that was deleted in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC2 - Find a person by name","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"marcus-ny"},"content":"1. User searches for a contact with desired prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of contacts that match the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"marcus-ny"},"content":"1a. User searches for a contact using an empty prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"marcus-ny"},"content":"1a. No contact matches the prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows a message in the status message that no contact matches the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC3 - Link a loan to contact","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"marcus-ny"},"content":"1. User links a contact with a loan, specifying the contact name and loan details.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"marcus-ny"},"content":"2. System links the loan to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact and the loan that was linked successfully in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"marcus-ny"},"content":"1a. Contact does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"marcus-ny"},"content":"1a. Loan details are invalid (e.g. empty, incomplete, wrong format). ","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the loan details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist. ","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"marcus-ny"},"content":"1a3. System links the loan to the chosen contact. ","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"marcus-ny"},"content":"1a4. System shows the contact and the loan that was linked successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC4 - View all loans linked to particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"marcus-ny"},"content":"1. User requests to view all loans linked to a particular contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of loans linked to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"marcus-ny"},"content":"1a. Contact name does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"marcus-ny"},"content":"1a3. System shows the list of loans linked to the chosen contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC5 - Clear a loan from contact","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"marcus-ny"},"content":"2. User issues `clear` command with the name of contact and the index of loan to be cleared.","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"marcus-ny"},"content":"3. System clears the loan from the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was cleared successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size)","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC6 - Mark a loan as returned","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"marcus-ny"},"content":"2. User marks a loan as returned specifying contact name and loan index.","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"marcus-ny"},"content":"3. System marks the loan as returned.","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was marked as returned successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"marcus-ny"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"marcus-ny"},"content":" able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"marcus-ny"},"content":"4. Should be able to handle up to 100 active (not archived) loans per contact without a noticeable sluggishness in","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"marcus-ny"},"content":" performance for typical","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"marcus-ny"},"content":" usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"marcus-ny"},"content":"5. Returned loans should be archived instead of deleted for future reference.","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"marcus-ny"},"content":"6. The archived data should be stored for at least 3 years.","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"marcus-ny"},"content":"7. Should be able to support multiple user sessions with password authentication on the same device.","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"marcus-ny"},"content":"8. Archived data should be encrypted and only accessible by authorized users (admin and the user who created the data).","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"marcus-ny"},"content":"9. Loan amounts should be in a single currency (e.g. USD, SGD, EUR, etc.) and should be formatted as per the currency","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"marcus-ny"},"content":" standards.","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"marcus-ny"},"content":"10. Loan deadlines should not be more than 100 years from the date of loan creation.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":484,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"marcus-ny"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be","lastModifiedDate":"2024-03-07"},{"lineNumber":504,"author":{"gitId":"marcus-ny"},"content":" optimum.","lastModifiedDate":"2024-03-07"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"marcus-ny"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":523,"author":{"gitId":"marcus-ny"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-07"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"marcus-ny":211,"-":328}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kjw142857"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W13-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W13-1/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W13-1/tp/graph/badge.svg?token\u003dMZAGQZIFNS)](https://codecov.io/gh/AY2324S2-CS2103T-W13-1/tp)","lastModifiedDate":"2024-02-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kjw142857"},"content":"* This is **LoanGuard Pro, an application that helps business owners manage clients and their loan details**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"kjw142857"},"content":" * to keep track of the items you have loaned out","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kjw142857"},"content":" * to view your history of loans by client","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kjw142857"},"content":"* The project builds on an existing Address Book used for managing contact details, **adding in a loan tracker functionality**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kjw142857"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"* It is named `LoanGuard Pro` because it represents a more powerful version of an address book, that can also manage the loans of your contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kjw142857"},"content":"* For the detailed documentation of this project, see the **[LoanGuard Pro Product Website](https://ay2324s2-cs2103t-w13-1.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"kjw142857":9,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"kjw142857"},"content":"### Khor Jun Wei","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"\u003cimg src\u003d\"images/kjw142857.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"content":"[[github](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kjw142857"},"content":"[[portfolio](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kjw142857"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"kjw142857"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"marcus-ny"},"content":"### Kyal Sin Min Thet","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"marcus-ny"},"content":"\u003cimg src\u003d\"images/marcus-ny.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"marcus-ny"},"content":"[[github](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"marcus-ny"},"content":"[[portfolio](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Joseph31416"},"content":"### Teoh Tze Tzun","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Joseph31416"},"content":"\u003cimg src\u003d\"images/joseph31416.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Joseph31416"},"content":"[[github](https://github.com/Joseph31416)] [[portfolio](https://github.com/Joseph31416)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"narwhalsilent"},"content":"### Wang Junwu","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"narwhalsilent"},"content":"\u003cimg src\u003d\"images/narwhalsilent.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"narwhalsilent"},"content":"[[github](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"narwhalsilent"},"content":"[[portfolio](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"narwhalsilent"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"xiaorui-ui"},"content":"### Zhang Xiaorui","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"xiaorui-ui"},"content":"\u003cimg src\u003d\"images/xiaorui-ui.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"xiaorui-ui"},"content":"[[github](https://github.com/xiaorui-ui)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"xiaorui-ui"},"content":"[[portfolio](https://github.com/xiaorui-ui)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"xiaorui-ui"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"marcus-ny":6,"xiaorui-ui":5,"Joseph31416":3,"-":34,"kjw142857":6,"narwhalsilent":5}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"marcus-ny"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"marcus-ny"},"content":" original source as well}","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"marcus-ny"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":41,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"marcus-ny"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"marcus-ny"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"marcus-ny"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"marcus-ny"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"marcus-ny"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-07"},{"lineNumber":63,"author":{"gitId":"marcus-ny"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"marcus-ny"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"marcus-ny"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"marcus-ny"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-07"},{"lineNumber":74,"author":{"gitId":"marcus-ny"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-07"},{"lineNumber":75,"author":{"gitId":"marcus-ny"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-07"},{"lineNumber":76,"author":{"gitId":"marcus-ny"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":80,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"marcus-ny"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":85,"author":{"gitId":"marcus-ny"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"marcus-ny"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-07"},{"lineNumber":90,"author":{"gitId":"marcus-ny"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-07"},{"lineNumber":91,"author":{"gitId":"marcus-ny"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"marcus-ny"},"content":"visible GUI.","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"marcus-ny"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that","lastModifiedDate":"2024-03-07"},{"lineNumber":95,"author":{"gitId":"marcus-ny"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"marcus-ny"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":97,"author":{"gitId":"marcus-ny"},"content":"is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":98,"author":{"gitId":"marcus-ny"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-07"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"marcus-ny"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"marcus-ny"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"marcus-ny"},"content":"call as an example.","lastModifiedDate":"2024-03-07"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":122,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":126,"author":{"gitId":"marcus-ny"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates","lastModifiedDate":"2024-03-07"},{"lineNumber":127,"author":{"gitId":"marcus-ny"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"marcus-ny"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"marcus-ny"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":131,"author":{"gitId":"marcus-ny"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"marcus-ny"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":140,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"marcus-ny"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"marcus-ny"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"marcus-ny"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"marcus-ny"},"content":" a `Command` object.","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"marcus-ny"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"marcus-ny"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"marcus-ny"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":159,"author":{"gitId":"marcus-ny"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"marcus-ny"},"content":" is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"marcus-ny"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"marcus-ny"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"marcus-ny"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"marcus-ny"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"marcus-ny"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":169,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"marcus-ny"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"marcus-ny"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":183,"author":{"gitId":"marcus-ny"},"content":" objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"marcus-ny"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"marcus-ny"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"marcus-ny"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"marcus-ny"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"marcus-ny"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-07"},{"lineNumber":204,"author":{"gitId":"marcus-ny"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-07"},{"lineNumber":205,"author":{"gitId":"marcus-ny"},"content":"following operations:","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":208,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":209,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"marcus-ny"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":212,"author":{"gitId":"marcus-ny"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"marcus-ny"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-07"},{"lineNumber":217,"author":{"gitId":"marcus-ny"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-07"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"marcus-ny"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-07"},{"lineNumber":222,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"marcus-ny"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"marcus-ny"},"content":"state.","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"marcus-ny"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-07"},{"lineNumber":229,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-07"},{"lineNumber":230,"author":{"gitId":"marcus-ny"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"marcus-ny"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing","lastModifiedDate":"2024-03-07"},{"lineNumber":239,"author":{"gitId":"marcus-ny"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-07"},{"lineNumber":240,"author":{"gitId":"marcus-ny"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":259,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":261,"author":{"gitId":"marcus-ny"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-07"},{"lineNumber":262,"author":{"gitId":"marcus-ny"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"marcus-ny"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-07"},{"lineNumber":269,"author":{"gitId":"marcus-ny"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"marcus-ny"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"marcus-ny"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-07"},{"lineNumber":275,"author":{"gitId":"marcus-ny"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-07"},{"lineNumber":276,"author":{"gitId":"marcus-ny"},"content":"purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern","lastModifiedDate":"2024-03-07"},{"lineNumber":277,"author":{"gitId":"marcus-ny"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":310,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"xiaorui-ui"},"content":"The target user is businessman who satisfies the following criteria","lastModifiedDate":"2024-03-08"},{"lineNumber":324,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":328,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"xiaorui-ui"},"content":"and wants to manage contacts faster than a typical mouse/GUI driven app. Typically,","lastModifiedDate":"2024-03-08"},{"lineNumber":331,"author":{"gitId":"xiaorui-ui"},"content":"they want to answer the following questions quickly:","lastModifiedDate":"2024-03-08"},{"lineNumber":332,"author":{"gitId":"xiaorui-ui"},"content":"* How much cash was loaned?","lastModifiedDate":"2024-03-10"},{"lineNumber":333,"author":{"gitId":"xiaorui-ui"},"content":"* To whom it was loaned to?","lastModifiedDate":"2024-03-08"},{"lineNumber":334,"author":{"gitId":"xiaorui-ui"},"content":"* When the person is due to return the loan?","lastModifiedDate":"2024-03-08"},{"lineNumber":335,"author":{"gitId":"xiaorui-ui"},"content":"* When did the person last loan?","lastModifiedDate":"2024-03-08"},{"lineNumber":336,"author":{"gitId":"xiaorui-ui"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":337,"author":{"gitId":"xiaorui-ui"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":338,"author":{"gitId":"xiaorui-ui"},"content":"**Value proposition**: Manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-10"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"xiaorui-ui"},"content":"Our address book is tailored for business owners whose job might involve loaning items on a ","lastModifiedDate":"2024-03-08"},{"lineNumber":341,"author":{"gitId":"xiaorui-ui"},"content":"regular basis. It simplifies loan categorization and tracks product quality post-return, ","lastModifiedDate":"2024-03-08"},{"lineNumber":342,"author":{"gitId":"xiaorui-ui"},"content":"ensuring efficient decision-making. Some boundaries include no detailed client reviews or ","lastModifiedDate":"2024-03-08"},{"lineNumber":343,"author":{"gitId":"xiaorui-ui"},"content":"personal loan management, as we focus solely on business loans and contact management for ","lastModifiedDate":"2024-03-08"},{"lineNumber":344,"author":{"gitId":"xiaorui-ui"},"content":"a select client group.","lastModifiedDate":"2024-03-08"},{"lineNumber":345,"author":{"gitId":"xiaorui-ui"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":346,"author":{"gitId":"xiaorui-ui"},"content":"Our software streamlines loanee management, preventing profit loss and enhancing partner relations.","lastModifiedDate":"2024-03-08"},{"lineNumber":347,"author":{"gitId":"xiaorui-ui"},"content":"It simplifies loan categorization and tracks product quality post-return, ensuring efficient ","lastModifiedDate":"2024-03-08"},{"lineNumber":348,"author":{"gitId":"xiaorui-ui"},"content":"decision-making. Some boundaries include no detailed client reviews or personal loan management, ","lastModifiedDate":"2024-03-08"},{"lineNumber":349,"author":{"gitId":"xiaorui-ui"},"content":"as we focus solely on business loans and contact management for a select client group.","lastModifiedDate":"2024-03-08"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":352,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"xiaorui-ui"},"content":"|----------|---------------------------------------------------|---------------------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-10"},{"lineNumber":358,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | User who loans cash out regularly | Add loan details (loanee /cash amount) to the contact | remember to collect debts at a later time |","lastModifiedDate":"2024-03-10"},{"lineNumber":359,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | User who loans cash out regularly | Add a deadline to a loan | chase after people more easily |","lastModifiedDate":"2024-03-10"},{"lineNumber":360,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | User who loans cash out regularly | View my past loans | know how much cash to expect in the near future |","lastModifiedDate":"2024-03-10"},{"lineNumber":361,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | User who loans cash out regularly | View my past loans | decide whether to loan to a client again |","lastModifiedDate":"2024-03-10"},{"lineNumber":362,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | User who loans cash out regularly | See the overdue loans easily | chase after people more easily |","lastModifiedDate":"2024-03-10"},{"lineNumber":363,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | User who values relationships | Send automated reminders to contacts with overdue loans | I can maintain good relations while ensuring the return of items |","lastModifiedDate":"2024-03-10"},{"lineNumber":364,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | Busy user | Keep track of all my loanees(view) | save time and use it for more meaningful activities |","lastModifiedDate":"2024-03-08"},{"lineNumber":365,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | Busy user | Quickly view a summary of all outstanding loans(view) | have an overview without going through each contact individually ","lastModifiedDate":"2024-03-09"},{"lineNumber":366,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | User who loans cash | Track partial repayments | maintain accurate records of the outstanding balance ","lastModifiedDate":"2024-03-10"},{"lineNumber":367,"author":{"gitId":"xiaorui-ui"},"content":"| `* * *` | User with a dynamic network | Delete loan | my records always reflect the current status of each loan |","lastModifiedDate":"2024-03-09"},{"lineNumber":368,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | User with a dynamic network | Update loan entries as situations change | my records always reflect the current status of each loan |","lastModifiedDate":"2024-03-10"},{"lineNumber":369,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | First time user | See the available commands/usage manual | familiarize with the command structure |","lastModifiedDate":"2024-03-08"},{"lineNumber":370,"author":{"gitId":"xiaorui-ui"},"content":"| `*` | Intermediate user | Learn shortcuts to commands | save time in the future |","lastModifiedDate":"2024-03-08"},{"lineNumber":371,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | Experienced user | Omit certain parts of the CLI commands | perform tasks more efficiently and quickly |","lastModifiedDate":"2024-03-08"},{"lineNumber":372,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | Forgetful user | Get reminders to collect cash | collect cash promptly |","lastModifiedDate":"2024-03-10"},{"lineNumber":373,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | Organised user | Have a system to manage my loanees | |","lastModifiedDate":"2024-03-08"},{"lineNumber":374,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | Detail-oriented user | Add notes to each loan entry | I can record specific details or conditions of the loan | |","lastModifiedDate":"2024-03-10"},{"lineNumber":375,"author":{"gitId":"xiaorui-ui"},"content":"| `* ` | User who lends frequently to the same individuals | View aggregated loan statistics per contact | I can understand our loan history at a glance |","lastModifiedDate":"2024-03-10"},{"lineNumber":376,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | Frequent lender | Track the history of cash loaned to and from a contact | I can reference past transactions during conversations |","lastModifiedDate":"2024-03-10"},{"lineNumber":377,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | User looking to minimize losses | Flag high-risk loans based on past behavior | I can make more informed lending decisions in the future |","lastModifiedDate":"2024-03-10"},{"lineNumber":378,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | User concerned with privacy | Mark certain contacts or loan entries as private | they are not visible during casual browsing of the address book |","lastModifiedDate":"2024-03-10"},{"lineNumber":379,"author":{"gitId":"xiaorui-ui"},"content":"| `* *` | Proactive user | Mark certain contacts or loan entries as private | they are not visible during casual browsing of the address book |","lastModifiedDate":"2024-03-10"},{"lineNumber":380,"author":{"gitId":"xiaorui-ui"},"content":"| `*` | User who appreciates convenience | Integrate the application with my calendar | loan due dates and follow-up reminders are automatically added |","lastModifiedDate":"2024-03-10"},{"lineNumber":381,"author":{"gitId":"xiaorui-ui"},"content":"| `*` | User who values clarity | Print or export detailed loan reports | I can have a physical or digital record for personal use or discussions |","lastModifiedDate":"2024-03-10"},{"lineNumber":382,"author":{"gitId":"xiaorui-ui"},"content":"| `*` | Collaborative user | Share loan entries with another user of the application | we can co-manage loans or items owned jointly |","lastModifiedDate":"2024-03-10"},{"lineNumber":383,"author":{"gitId":"xiaorui-ui"},"content":"| `*` | User with international contacts | Store and view currency information for cash loans | I can accurately track and manage international loans |","lastModifiedDate":"2024-03-10"},{"lineNumber":384,"author":{"gitId":"xiaorui-ui"},"content":"| `*` | User who appreciates personalization | Customize the notification settings for loan reminders | I can receive them through my preferred communication channel |","lastModifiedDate":"2024-03-10"},{"lineNumber":385,"author":{"gitId":"xiaorui-ui"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"marcus-ny"},"content":"(For all use cases below, the **System** is the `LoanGuard Pro` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"marcus-ny"},"content":"otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC1 - Delete a contact","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"marcus-ny"},"content":"Precondition: `list` command shows a numbered list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"marcus-ny"},"content":"1. User requests to delete a contact, specifying the index.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"marcus-ny"},"content":"2. System deletes the contact from the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact that was deleted in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC2 - Find a person by name","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"marcus-ny"},"content":"1. User searches for a contact with desired prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of contacts that match the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"marcus-ny"},"content":"1a. User searches for a contact using an empty prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"marcus-ny"},"content":"1a. No contact matches the prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows a message in the status message that no contact matches the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC3 - Link a loan to contact","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"marcus-ny"},"content":"1. User links a contact with a loan, specifying the contact name and loan details.","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"marcus-ny"},"content":"2. System links the loan to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact and the loan that was linked successfully in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"marcus-ny"},"content":"1a. Contact does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"marcus-ny"},"content":"1a. Loan details are invalid (e.g. empty, incomplete, wrong format). ","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the loan details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist. ","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"marcus-ny"},"content":"1a3. System links the loan to the chosen contact. ","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"marcus-ny"},"content":"1a4. System shows the contact and the loan that was linked successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC4 - View all loans linked to particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"marcus-ny"},"content":"1. User requests to view all loans linked to a particular contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of loans linked to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"marcus-ny"},"content":"1a. Contact name does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"marcus-ny"},"content":"1a3. System shows the list of loans linked to the chosen contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC5 - Clear a loan from contact","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"marcus-ny"},"content":"2. User issues `clear` command with the name of contact and the index of loan to be cleared.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"marcus-ny"},"content":"3. System clears the loan from the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":481,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was cleared successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":482,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":483,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":484,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":485,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":486,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size)","lastModifiedDate":"2024-03-07"},{"lineNumber":487,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":490,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC6 - Mark a loan as returned","lastModifiedDate":"2024-03-07"},{"lineNumber":491,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":492,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":493,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":494,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":495,"author":{"gitId":"marcus-ny"},"content":"2. User marks a loan as returned specifying contact name and loan index.","lastModifiedDate":"2024-03-07"},{"lineNumber":496,"author":{"gitId":"marcus-ny"},"content":"3. System marks the loan as returned.","lastModifiedDate":"2024-03-07"},{"lineNumber":497,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was marked as returned successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":498,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":499,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":500,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":501,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":502,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":503,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":504,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"marcus-ny"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be","lastModifiedDate":"2024-03-07"},{"lineNumber":511,"author":{"gitId":"marcus-ny"},"content":" able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":512,"author":{"gitId":"marcus-ny"},"content":"4. Should be able to handle up to 100 active (not archived) loans per contact without a noticeable sluggishness in","lastModifiedDate":"2024-03-07"},{"lineNumber":513,"author":{"gitId":"marcus-ny"},"content":" performance for typical","lastModifiedDate":"2024-03-07"},{"lineNumber":514,"author":{"gitId":"marcus-ny"},"content":" usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":515,"author":{"gitId":"marcus-ny"},"content":"5. Returned loans should be archived instead of deleted for future reference.","lastModifiedDate":"2024-03-07"},{"lineNumber":516,"author":{"gitId":"marcus-ny"},"content":"6. The archived data should be stored for at least 3 years.","lastModifiedDate":"2024-03-07"},{"lineNumber":517,"author":{"gitId":"marcus-ny"},"content":"7. Should be able to support multiple user sessions with password authentication on the same device.","lastModifiedDate":"2024-03-07"},{"lineNumber":518,"author":{"gitId":"marcus-ny"},"content":"8. Archived data should be encrypted and only accessible by authorized users (admin and the user who created the data).","lastModifiedDate":"2024-03-07"},{"lineNumber":519,"author":{"gitId":"marcus-ny"},"content":"9. Loan amounts should be in a single currency (e.g. USD, SGD, EUR, etc.) and should be formatted as per the currency","lastModifiedDate":"2024-03-07"},{"lineNumber":520,"author":{"gitId":"marcus-ny"},"content":" standards.","lastModifiedDate":"2024-03-07"},{"lineNumber":521,"author":{"gitId":"marcus-ny"},"content":"10. Loan deadlines should not be more than 100 years from the date of loan creation.","lastModifiedDate":"2024-03-07"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"xiaorui-ui"},"content":"Order is roughly according to the order in which they first appear in the guide.","lastModifiedDate":"2024-03-10"},{"lineNumber":526,"author":{"gitId":"xiaorui-ui"},"content":"* **Architecture Diagram**: A diagram that shows how the different components interact with each","lastModifiedDate":"2024-03-10"},{"lineNumber":527,"author":{"gitId":"xiaorui-ui"},"content":"other at a high level.","lastModifiedDate":"2024-03-10"},{"lineNumber":528,"author":{"gitId":"xiaorui-ui"},"content":"* **Sequence Diagram**: A diagram that shows how the different components interact with each other ","lastModifiedDate":"2024-03-10"},{"lineNumber":529,"author":{"gitId":"xiaorui-ui"},"content":"when a particular command is executed.","lastModifiedDate":"2024-03-10"},{"lineNumber":530,"author":{"gitId":"xiaorui-ui"},"content":"* **API**: Application Programming Interface, a set of rules that allows different software applications ","lastModifiedDate":"2024-03-10"},{"lineNumber":531,"author":{"gitId":"xiaorui-ui"},"content":"to communicate with each other to form an entire system.","lastModifiedDate":"2024-03-10"},{"lineNumber":532,"author":{"gitId":"xiaorui-ui"},"content":"* **UI**: User Interface","lastModifiedDate":"2024-03-10"},{"lineNumber":533,"author":{"gitId":"xiaorui-ui"},"content":"* **OOP**: Object-Oriented Programming, a programming paradigm based on the concept of \"objects\", ","lastModifiedDate":"2024-03-10"},{"lineNumber":534,"author":{"gitId":"xiaorui-ui"},"content":"which can contain data and code: data in the form of fields, and code in the form of procedures.","lastModifiedDate":"2024-03-10"},{"lineNumber":535,"author":{"gitId":"xiaorui-ui"},"content":"The objects interact with each other. ","lastModifiedDate":"2024-03-10"},{"lineNumber":536,"author":{"gitId":"xiaorui-ui"},"content":"* **Class**: Classes are used to create and define objects. A feature of OOP.","lastModifiedDate":"2024-03-10"},{"lineNumber":537,"author":{"gitId":"xiaorui-ui"},"content":"* **JSON**: JavaScript Object Notation, a lightweight data-interchange format. Files of this format ","lastModifiedDate":"2024-03-10"},{"lineNumber":538,"author":{"gitId":"xiaorui-ui"},"content":"are used to store loan data on the hard disk.","lastModifiedDate":"2024-03-10"},{"lineNumber":539,"author":{"gitId":"xiaorui-ui"},"content":"* **Data archiving**: The process of moving data that is no longer actively used to a separate storage","lastModifiedDate":"2024-03-10"},{"lineNumber":540,"author":{"gitId":"xiaorui-ui"},"content":"* **CLI**: Command Line Interface","lastModifiedDate":"2024-03-10"},{"lineNumber":541,"author":{"gitId":"xiaorui-ui"},"content":"* **GUI**: Graphical User Interface","lastModifiedDate":"2024-03-10"},{"lineNumber":542,"author":{"gitId":"xiaorui-ui"},"content":"* **User stories**: A user story is an informal, general explanation of a software feature written from the ","lastModifiedDate":"2024-03-10"},{"lineNumber":543,"author":{"gitId":"xiaorui-ui"},"content":"perspective of the end user.","lastModifiedDate":"2024-03-10"},{"lineNumber":544,"author":{"gitId":"xiaorui-ui"},"content":"* **Cash**: Money in the form of coins or notes, as opposed to cheques or credit. *All loans in this project ","lastModifiedDate":"2024-03-10"},{"lineNumber":545,"author":{"gitId":"xiaorui-ui"},"content":"are in cash, rather than items*. For consistency, we will avoid using the term \"money\" in this guide.","lastModifiedDate":"2024-03-10"},{"lineNumber":546,"author":{"gitId":"xiaorui-ui"},"content":"* **Currency**: Money of a certain country(e.g. USD, SGD, EUR for United States Dollars, SinGapore Dollars, ","lastModifiedDate":"2024-03-10"},{"lineNumber":547,"author":{"gitId":"xiaorui-ui"},"content":"and EURos respectively).","lastModifiedDate":"2024-03-10"},{"lineNumber":548,"author":{"gitId":"xiaorui-ui"},"content":"* **Use cases**: A specific situation in which a product or service could potentially be used.","lastModifiedDate":"2024-03-10"},{"lineNumber":549,"author":{"gitId":"xiaorui-ui"},"content":"* **Actor**: A person or thing that performs an action.","lastModifiedDate":"2024-03-10"},{"lineNumber":550,"author":{"gitId":"xiaorui-ui"},"content":"* **MSS**: Main Success Scenario, the most common path through a use case.","lastModifiedDate":"2024-03-10"},{"lineNumber":551,"author":{"gitId":"xiaorui-ui"},"content":"* **Extensions**: The alternative paths through a use case.","lastModifiedDate":"2024-03-10"},{"lineNumber":552,"author":{"gitId":"xiaorui-ui"},"content":"* **Non-Functional Requirements**: A requirement that specifies criteria that can be used to judge the operation of ","lastModifiedDate":"2024-03-10"},{"lineNumber":553,"author":{"gitId":"xiaorui-ui"},"content":"a system, rather than specific behaviours.","lastModifiedDate":"2024-03-10"},{"lineNumber":554,"author":{"gitId":"xiaorui-ui"},"content":"* **Mainstream OS**: Windows, Linux, Unix, or MacOS","lastModifiedDate":"2024-03-10"},{"lineNumber":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"marcus-ny"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be","lastModifiedDate":"2024-03-07"},{"lineNumber":574,"author":{"gitId":"marcus-ny"},"content":" optimum.","lastModifiedDate":"2024-03-07"},{"lineNumber":575,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":578,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":579,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":580,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":581,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":582,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":583,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":584,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":585,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":586,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":587,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":592,"author":{"gitId":"marcus-ny"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":593,"author":{"gitId":"marcus-ny"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-07"},{"lineNumber":594,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":595,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":596,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":597,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":598,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":600,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":601,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":602,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":605,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":606,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"marcus-ny":210,"xiaorui-ui":79,"-":320}},{"path":"src/main/java/seedu/address/model/person/Loan.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Joseph31416"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":3,"author":{"gitId":"Joseph31416"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"Joseph31416"},"content":"import java.util.Date;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"Joseph31416"},"content":"/**","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"Joseph31416"},"content":" * Represents a Loan in the address book.","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"Joseph31416"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"Joseph31416"},"content":"public class Loan {","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"Joseph31416"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Loans must be positive and have \"","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"Joseph31416"},"content":" + \"a start date before the end date.\";","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"Joseph31416"},"content":" // Tracks the next id to be assigned to a loan","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"Joseph31416"},"content":" private static int nextId \u003d 1;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"Joseph31416"},"content":" private final int id;","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"Joseph31416"},"content":" private final float amount;","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"Joseph31416"},"content":" private final Date startDate;","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"Joseph31416"},"content":" private final Date endDate;","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"Joseph31416"},"content":" * Constructs a {@code Loan}.","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"Joseph31416"},"content":" *","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"Joseph31416"},"content":" * @param amount A valid amount.","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"Joseph31416"},"content":" * @param startDate A valid start date.","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"Joseph31416"},"content":" * @param endDate A valid end date.","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"Joseph31416"},"content":" public Loan(float amount, Date startDate, Date endDate) {","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"Joseph31416"},"content":" requireAllNonNull(amount, startDate, endDate);","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"Joseph31416"},"content":" this.id \u003d nextId++;","lastModifiedDate":"2024-03-10"},{"lineNumber":34,"author":{"gitId":"Joseph31416"},"content":" this.amount \u003d amount;","lastModifiedDate":"2024-03-10"},{"lineNumber":35,"author":{"gitId":"Joseph31416"},"content":" this.startDate \u003d startDate;","lastModifiedDate":"2024-03-10"},{"lineNumber":36,"author":{"gitId":"Joseph31416"},"content":" this.endDate \u003d endDate;","lastModifiedDate":"2024-03-10"},{"lineNumber":37,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":38,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":39,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":40,"author":{"gitId":"Joseph31416"},"content":" * Returns true if a given float is a valid amount.","lastModifiedDate":"2024-03-10"},{"lineNumber":41,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"Joseph31416"},"content":" public static boolean isValidAmount(float amount) {","lastModifiedDate":"2024-03-10"},{"lineNumber":43,"author":{"gitId":"Joseph31416"},"content":" return amount \u003e 0;","lastModifiedDate":"2024-03-10"},{"lineNumber":44,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":45,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":47,"author":{"gitId":"Joseph31416"},"content":" * Returns true if a given start date and end date are valid.","lastModifiedDate":"2024-03-10"},{"lineNumber":48,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":49,"author":{"gitId":"Joseph31416"},"content":" public static boolean isValidDates(Date startDate, Date endDate) {","lastModifiedDate":"2024-03-10"},{"lineNumber":50,"author":{"gitId":"Joseph31416"},"content":" return startDate.before(endDate);","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":53,"author":{"gitId":"Joseph31416"},"content":" public int getId() {","lastModifiedDate":"2024-03-10"},{"lineNumber":54,"author":{"gitId":"Joseph31416"},"content":" return id;","lastModifiedDate":"2024-03-10"},{"lineNumber":55,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":56,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":57,"author":{"gitId":"Joseph31416"},"content":" public float getAmount() {","lastModifiedDate":"2024-03-10"},{"lineNumber":58,"author":{"gitId":"Joseph31416"},"content":" return amount;","lastModifiedDate":"2024-03-10"},{"lineNumber":59,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":60,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":61,"author":{"gitId":"Joseph31416"},"content":" public Date getStartDate() {","lastModifiedDate":"2024-03-10"},{"lineNumber":62,"author":{"gitId":"Joseph31416"},"content":" return startDate;","lastModifiedDate":"2024-03-10"},{"lineNumber":63,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":64,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":65,"author":{"gitId":"Joseph31416"},"content":" public Date getEndDate() {","lastModifiedDate":"2024-03-10"},{"lineNumber":66,"author":{"gitId":"Joseph31416"},"content":" return endDate;","lastModifiedDate":"2024-03-10"},{"lineNumber":67,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":68,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":69,"author":{"gitId":"Joseph31416"},"content":" @Override","lastModifiedDate":"2024-03-10"},{"lineNumber":70,"author":{"gitId":"Joseph31416"},"content":" public String toString() {","lastModifiedDate":"2024-03-10"},{"lineNumber":71,"author":{"gitId":"Joseph31416"},"content":" return String.format(\"$%.2f, %s, %s\", amount, startDate, endDate);","lastModifiedDate":"2024-03-10"},{"lineNumber":72,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":73,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":74,"author":{"gitId":"Joseph31416"},"content":" @Override","lastModifiedDate":"2024-03-10"},{"lineNumber":75,"author":{"gitId":"Joseph31416"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-10"},{"lineNumber":76,"author":{"gitId":"Joseph31416"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-10"},{"lineNumber":77,"author":{"gitId":"Joseph31416"},"content":" return true;","lastModifiedDate":"2024-03-10"},{"lineNumber":78,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":79,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":80,"author":{"gitId":"Joseph31416"},"content":" if (!(other instanceof Loan)) {","lastModifiedDate":"2024-03-10"},{"lineNumber":81,"author":{"gitId":"Joseph31416"},"content":" return false;","lastModifiedDate":"2024-03-10"},{"lineNumber":82,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":83,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":84,"author":{"gitId":"Joseph31416"},"content":" Loan otherLoan \u003d (Loan) other;","lastModifiedDate":"2024-03-10"},{"lineNumber":85,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":86,"author":{"gitId":"Joseph31416"},"content":" return id \u003d\u003d otherLoan.id;","lastModifiedDate":"2024-03-10"},{"lineNumber":87,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":88,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":89,"author":{"gitId":"Joseph31416"},"content":" @Override","lastModifiedDate":"2024-03-10"},{"lineNumber":90,"author":{"gitId":"Joseph31416"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-10"},{"lineNumber":91,"author":{"gitId":"Joseph31416"},"content":" return id;","lastModifiedDate":"2024-03-10"},{"lineNumber":92,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":93,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":94,"author":{"gitId":"Joseph31416"},"content":"}","lastModifiedDate":"2024-03-10"}],"authorContributionMap":{"Joseph31416":94}},{"path":"src/main/java/seedu/address/model/person/LoanRecords.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Joseph31416"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":3,"author":{"gitId":"Joseph31416"},"content":"import java.util.ArrayList;","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"Joseph31416"},"content":"import java.util.Date;","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"Joseph31416"},"content":"import java.util.List;","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"Joseph31416"},"content":"/**","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"Joseph31416"},"content":" * Represents a list of loans in the address book.","lastModifiedDate":"2024-03-10"},{"lineNumber":9,"author":{"gitId":"Joseph31416"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2024-03-10"},{"lineNumber":10,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"Joseph31416"},"content":"public class LoanRecords {","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"Joseph31416"},"content":" // Tracks the next id to be assigned to a loan record","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"Joseph31416"},"content":" private static int nextId \u003d 1;","lastModifiedDate":"2024-03-10"},{"lineNumber":15,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":16,"author":{"gitId":"Joseph31416"},"content":" private List\u003cLoan\u003e loans;","lastModifiedDate":"2024-03-10"},{"lineNumber":17,"author":{"gitId":"Joseph31416"},"content":" private int id;","lastModifiedDate":"2024-03-10"},{"lineNumber":18,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":19,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":20,"author":{"gitId":"Joseph31416"},"content":" * Constructs a {@code LoanRecords}.","lastModifiedDate":"2024-03-10"},{"lineNumber":21,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":22,"author":{"gitId":"Joseph31416"},"content":" public LoanRecords() {","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"Joseph31416"},"content":" loans \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"Joseph31416"},"content":" id \u003d nextId++;","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"Joseph31416"},"content":" * Adds a loan to the list of loans.","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"Joseph31416"},"content":" * @param loan A valid loan.","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"Joseph31416"},"content":" public void addLoan(Loan loan) {","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"Joseph31416"},"content":" loans.add(loan);","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":34,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":35,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":36,"author":{"gitId":"Joseph31416"},"content":" * Adds a loan to the list of loans.","lastModifiedDate":"2024-03-10"},{"lineNumber":37,"author":{"gitId":"Joseph31416"},"content":" * @param amount A valid amount.","lastModifiedDate":"2024-03-10"},{"lineNumber":38,"author":{"gitId":"Joseph31416"},"content":" * @param startDate A valid start date.","lastModifiedDate":"2024-03-10"},{"lineNumber":39,"author":{"gitId":"Joseph31416"},"content":" * @param endDate A valid end date.","lastModifiedDate":"2024-03-10"},{"lineNumber":40,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":41,"author":{"gitId":"Joseph31416"},"content":" public void addLoan(float amount, Date startDate, Date endDate) {","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"Joseph31416"},"content":" Loan loan \u003d new Loan(amount, startDate, endDate);","lastModifiedDate":"2024-03-10"},{"lineNumber":43,"author":{"gitId":"Joseph31416"},"content":" addLoan(loan);","lastModifiedDate":"2024-03-10"},{"lineNumber":44,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":45,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":47,"author":{"gitId":"Joseph31416"},"content":" * Removes a loan from the list of loans.","lastModifiedDate":"2024-03-10"},{"lineNumber":48,"author":{"gitId":"Joseph31416"},"content":" * @param loan A valid loan.","lastModifiedDate":"2024-03-10"},{"lineNumber":49,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":50,"author":{"gitId":"Joseph31416"},"content":" public void removeLoan(Loan loan) {","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"Joseph31416"},"content":" loans.remove(loan);","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":53,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":54,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":55,"author":{"gitId":"Joseph31416"},"content":" * Removes a loan from the list of loans.","lastModifiedDate":"2024-03-10"},{"lineNumber":56,"author":{"gitId":"Joseph31416"},"content":" * @param amount A valid amount.","lastModifiedDate":"2024-03-10"},{"lineNumber":57,"author":{"gitId":"Joseph31416"},"content":" * @param startDate A valid start date.","lastModifiedDate":"2024-03-10"},{"lineNumber":58,"author":{"gitId":"Joseph31416"},"content":" * @param endDate A valid end date.","lastModifiedDate":"2024-03-10"},{"lineNumber":59,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":60,"author":{"gitId":"Joseph31416"},"content":" public void removeLoan(float amount, Date startDate, Date endDate) {","lastModifiedDate":"2024-03-10"},{"lineNumber":61,"author":{"gitId":"Joseph31416"},"content":" Loan loan \u003d new Loan(amount, startDate, endDate);","lastModifiedDate":"2024-03-10"},{"lineNumber":62,"author":{"gitId":"Joseph31416"},"content":" removeLoan(loan);","lastModifiedDate":"2024-03-10"},{"lineNumber":63,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":64,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":65,"author":{"gitId":"Joseph31416"},"content":" /**","lastModifiedDate":"2024-03-10"},{"lineNumber":66,"author":{"gitId":"Joseph31416"},"content":" * @param idx A valid index.","lastModifiedDate":"2024-03-10"},{"lineNumber":67,"author":{"gitId":"Joseph31416"},"content":" * @return The loan at the specified index.","lastModifiedDate":"2024-03-10"},{"lineNumber":68,"author":{"gitId":"Joseph31416"},"content":" */","lastModifiedDate":"2024-03-10"},{"lineNumber":69,"author":{"gitId":"Joseph31416"},"content":" public Loan getLoan(int idx) {","lastModifiedDate":"2024-03-10"},{"lineNumber":70,"author":{"gitId":"Joseph31416"},"content":" return loans.get(idx);","lastModifiedDate":"2024-03-10"},{"lineNumber":71,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":72,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":73,"author":{"gitId":"Joseph31416"},"content":" @Override","lastModifiedDate":"2024-03-10"},{"lineNumber":74,"author":{"gitId":"Joseph31416"},"content":" public String toString() {","lastModifiedDate":"2024-03-10"},{"lineNumber":75,"author":{"gitId":"Joseph31416"},"content":" String output \u003d \"Loan Records:\\n\";","lastModifiedDate":"2024-03-10"},{"lineNumber":76,"author":{"gitId":"Joseph31416"},"content":" int idx \u003d 1;","lastModifiedDate":"2024-03-10"},{"lineNumber":77,"author":{"gitId":"Joseph31416"},"content":" for (Loan loan : loans) {","lastModifiedDate":"2024-03-10"},{"lineNumber":78,"author":{"gitId":"Joseph31416"},"content":" output +\u003d idx + \". \" + loan.toString() + \"\\n\";","lastModifiedDate":"2024-03-10"},{"lineNumber":79,"author":{"gitId":"Joseph31416"},"content":" idx++;","lastModifiedDate":"2024-03-10"},{"lineNumber":80,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":81,"author":{"gitId":"Joseph31416"},"content":" return output;","lastModifiedDate":"2024-03-10"},{"lineNumber":82,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":83,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":84,"author":{"gitId":"Joseph31416"},"content":" @Override","lastModifiedDate":"2024-03-10"},{"lineNumber":85,"author":{"gitId":"Joseph31416"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-10"},{"lineNumber":86,"author":{"gitId":"Joseph31416"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-10"},{"lineNumber":87,"author":{"gitId":"Joseph31416"},"content":" return true;","lastModifiedDate":"2024-03-10"},{"lineNumber":88,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":89,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":90,"author":{"gitId":"Joseph31416"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-10"},{"lineNumber":91,"author":{"gitId":"Joseph31416"},"content":" if (!(other instanceof LoanRecords)) {","lastModifiedDate":"2024-03-10"},{"lineNumber":92,"author":{"gitId":"Joseph31416"},"content":" return false;","lastModifiedDate":"2024-03-10"},{"lineNumber":93,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":94,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":95,"author":{"gitId":"Joseph31416"},"content":" LoanRecords otherLoanRecords \u003d (LoanRecords) other;","lastModifiedDate":"2024-03-10"},{"lineNumber":96,"author":{"gitId":"Joseph31416"},"content":" return this.id \u003d\u003d otherLoanRecords.id;","lastModifiedDate":"2024-03-10"},{"lineNumber":97,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":98,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":99,"author":{"gitId":"Joseph31416"},"content":" @Override","lastModifiedDate":"2024-03-10"},{"lineNumber":100,"author":{"gitId":"Joseph31416"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-10"},{"lineNumber":101,"author":{"gitId":"Joseph31416"},"content":" return id;","lastModifiedDate":"2024-03-10"},{"lineNumber":102,"author":{"gitId":"Joseph31416"},"content":" }","lastModifiedDate":"2024-03-10"},{"lineNumber":103,"author":{"gitId":"Joseph31416"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":104,"author":{"gitId":"Joseph31416"},"content":"}","lastModifiedDate":"2024-03-10"}],"authorContributionMap":{"Joseph31416":104}}] diff --git a/AY2324S2-CS2103T-W13-1_tp_master/commits.json b/AY2324S2-CS2103T-W13-1_tp_master/commits.json index dcbcbd40..2161b44a 100644 --- a/AY2324S2-CS2103T-W13-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W13-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"marcus-ny":[{"date":"2024-03-07","commitResults":[{"hash":"bbfef9edba350ff80222f9e797331dfa7a5f6f86","isMergeCommit":false,"messageTitle":"Update AboutUs.md for marcus-ny","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"60d4f1873ae6ad4538324dcd87bf7f390ddb8b15","isMergeCommit":false,"messageTitle":"Add non-trivial use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":228,"deletions":81}}},{"hash":"afdff3047dfa140ff4d8be10b83cd89b8d543002","isMergeCommit":false,"messageTitle":"Format Use Cases in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":38}}},{"hash":"19c2bc4c69b911d01dad12a331c100772fe7052b","isMergeCommit":false,"messageTitle":"Add Non-functional requirements to DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":2}}},{"hash":"d6ec0448fa59e016b58a1dec39c081c9406711e3","isMergeCommit":true,"messageTitle":"Merge pull request #26 from narwhalsilent/branch-AboutUs-Junwu","messageBody":"Fixes #15 Update AboutUs to include Junwu","fileTypesAndContributionMap":{}}]}],"xiaorui-ui":[{"date":"2024-03-07","commitResults":[{"hash":"f5946afe35d1d3df7f081a9deb0f5451c37f8b55","isMergeCommit":false,"messageTitle":"Update AboutUs xiaorui-ui","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"b518e1ed78a56bb52109d19bea651a8431376191","isMergeCommit":false,"messageTitle":"Update aboutus xiaorui","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"Joseph31416":[{"date":"2024-03-06","commitResults":[{"hash":"ae1b6859af73c81f67d6c14374c32e7f0d1455b4","isMergeCommit":false,"messageTitle":"update jospeh\u0027s AboutUs.md section","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"fea27c42f67a8be4e80947a6800041698dfb5cbc","isMergeCommit":true,"messageTitle":"Merge pull request #17 from kjw142857/about-us","messageBody":"Fixes #8 Jun Wei\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"0035d59ed9018e5f0406d2ff491a7ffcfb354096","isMergeCommit":true,"messageTitle":"Merge pull request #22 from marcus-ny/branch-update-DG-usecases-and-nfrs","messageBody":"Update Use Cases and NFRs in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"320fafc0b0d07970b7efc16ff68b4bebee7c6079","isMergeCommit":true,"messageTitle":"Merge pull request #20 from kjw142857/update-readme","messageBody":"Fixes #10 Edit README.md to reflect project scope","fileTypesAndContributionMap":{}},{"hash":"fc68db89ce36d2caa2b8cc3e2074d774a514a601","isMergeCommit":true,"messageTitle":"Merge pull request #25 from narwhalsilent/branch-ReadMEUi","messageBody":"Fixes #16 Update UI Mockup","fileTypesAndContributionMap":{}}]}],"kjw142857":[{"date":"2024-03-06","commitResults":[{"hash":"6c58495f0d7410c532dd4a9533b4d1e9af3660d7","isMergeCommit":false,"messageTitle":"Add developer info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"1243ec8fc9b0c3c3dc65a40282b83f604c4c37a6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"ad4b7d0f93d2a9ced885d29bad129fb952bdcaac","isMergeCommit":true,"messageTitle":"Merge pull request #21 from marcus-ny/branch-update-AboutUs-marcus-ny","messageBody":"Update AboutUs.md for marcus-ny","fileTypesAndContributionMap":{}},{"hash":"f36fdec8ff32dea0e9170cd5389e525d1076e192","isMergeCommit":true,"messageTitle":"Merge pull request #27 from xiaorui-ui/Aboutus-xiaorui","messageBody":"Update AboutUs xiaorui-ui","fileTypesAndContributionMap":{}}]}],"narwhalsilent":[{"date":"2024-03-06","commitResults":[{"hash":"319b2ff3f2a0368ef1ffc897aaa2972b6392a01a","isMergeCommit":true,"messageTitle":"Merge pull request #14 from Joseph31416/update_joseph_about_us","messageBody":"fixes #5 Tze Tzun\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"1decddfade9a6cb0fa0e2eecb4f689dc6c099065","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into branch-ReadMEUi","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2ab4f18be1b172d61a49af6b26d7d5dba6233630","isMergeCommit":false,"messageTitle":"Update AboutUs to include Junwu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}]},"authorFileTypeContributionMap":{"marcus-ny":{"docs":217,"functional-code":0,"test-code":0},"xiaorui-ui":{"docs":5,"functional-code":0,"test-code":0},"Joseph31416":{"docs":3,"functional-code":0,"test-code":0},"kjw142857":{"docs":15,"functional-code":0,"test-code":0},"narwhalsilent":{"docs":5,"functional-code":0,"test-code":0}},"authorContributionVariance":{"marcus-ny":11203.944,"xiaorui-ui":9.551021,"Joseph31416":2.3877552,"kjw142857":28.836735,"narwhalsilent":6.6326528},"authorDisplayNameMap":{"marcus-ny":"CS2103T-W13-1 KYAL..THET","xiaorui-ui":"CS2103T-W13-1 ZHAN..ORUI","Joseph31416":"CS2103T-W13-1 TEOH..TZUN","kjw142857":"CS2103T-W13-1 KHOR.. WEI","narwhalsilent":"CS2103T-W13-1 WANG..UNWU"}} +{"authorDailyContributionsMap":{"marcus-ny":[{"date":"2024-03-07","commitResults":[{"hash":"bbfef9edba350ff80222f9e797331dfa7a5f6f86","isMergeCommit":false,"messageTitle":"Update AboutUs.md for marcus-ny","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"60d4f1873ae6ad4538324dcd87bf7f390ddb8b15","isMergeCommit":false,"messageTitle":"Add non-trivial use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":228,"deletions":81}}},{"hash":"afdff3047dfa140ff4d8be10b83cd89b8d543002","isMergeCommit":false,"messageTitle":"Format Use Cases in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":38}}},{"hash":"19c2bc4c69b911d01dad12a331c100772fe7052b","isMergeCommit":false,"messageTitle":"Add Non-functional requirements to DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":2}}},{"hash":"d6ec0448fa59e016b58a1dec39c081c9406711e3","isMergeCommit":true,"messageTitle":"Merge pull request #26 from narwhalsilent/branch-AboutUs-Junwu","messageBody":"Fixes #15 Update AboutUs to include Junwu","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"5fc020abf1b446d8279dfdfead3c4d43234d2731","isMergeCommit":true,"messageTitle":"Merge pull request #28 from xiaorui-ui/DG","messageBody":"Fixes #11 Update DG: Product Scope, User stories and Glossary","fileTypesAndContributionMap":{}},{"hash":"4765b16982e7a3c8810a68697f0191e68396ad34","isMergeCommit":true,"messageTitle":"Merge pull request #35 from AY2324S2-CS2103T-W13-1/revert-34-add_loan_class","messageBody":"Revert \"Fixes #3 Add Loan class and LoanRecords class.\"","fileTypesAndContributionMap":{}},{"hash":"827d2005bbc077d1d684b50022dcf0721d33d060","isMergeCommit":true,"messageTitle":"Merge pull request #36 from Joseph31416/add_loan_class","messageBody":"Fixes #3 Add Loan class and LoanRecords class.","fileTypesAndContributionMap":{}}]}],"xiaorui-ui":[{"date":"2024-03-07","commitResults":[{"hash":"f5946afe35d1d3df7f081a9deb0f5451c37f8b55","isMergeCommit":false,"messageTitle":"Update AboutUs xiaorui-ui","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"b518e1ed78a56bb52109d19bea651a8431376191","isMergeCommit":false,"messageTitle":"Update aboutus xiaorui","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"2389ee30802f03d1033152f10f00b8ca11c0778e","isMergeCommit":false,"messageTitle":"Edit product scope","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":0}}},{"hash":"bc1612b8ffd030f17572f356cebe043de6404026","isMergeCommit":false,"messageTitle":"Edit user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":10}}}]},{"date":"2024-03-09","commitResults":[{"hash":"c544302568c372ea7f7215052ca58120ddf01bce","isMergeCommit":false,"messageTitle":"Update user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-10","commitResults":[{"hash":"53cca3ead5949b65a88cc2c52a6ed4ddea6ece17","isMergeCommit":false,"messageTitle":"Update user stories and glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":61,"deletions":21}}}]}],"Joseph31416":[{"date":"2024-03-06","commitResults":[{"hash":"ae1b6859af73c81f67d6c14374c32e7f0d1455b4","isMergeCommit":false,"messageTitle":"update jospeh\u0027s AboutUs.md section","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"fea27c42f67a8be4e80947a6800041698dfb5cbc","isMergeCommit":true,"messageTitle":"Merge pull request #17 from kjw142857/about-us","messageBody":"Fixes #8 Jun Wei\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"0035d59ed9018e5f0406d2ff491a7ffcfb354096","isMergeCommit":true,"messageTitle":"Merge pull request #22 from marcus-ny/branch-update-DG-usecases-and-nfrs","messageBody":"Update Use Cases and NFRs in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"320fafc0b0d07970b7efc16ff68b4bebee7c6079","isMergeCommit":true,"messageTitle":"Merge pull request #20 from kjw142857/update-readme","messageBody":"Fixes #10 Edit README.md to reflect project scope","fileTypesAndContributionMap":{}},{"hash":"fc68db89ce36d2caa2b8cc3e2074d774a514a601","isMergeCommit":true,"messageTitle":"Merge pull request #25 from narwhalsilent/branch-ReadMEUi","messageBody":"Fixes #16 Update UI Mockup","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"8a5c89cf42e1d420c04523b372cb554e93071518","isMergeCommit":false,"messageTitle":"Add Loan class and LoanRecords class.","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":205,"deletions":0}}},{"hash":"fa8c260404cc395f83ccae61e50defe73e4ecdee","isMergeCommit":true,"messageTitle":"Merge pull request #34 from Joseph31416/add_loan_class","messageBody":"Fixes #3 Add Loan class and LoanRecords class.","fileTypesAndContributionMap":{}},{"hash":"a78a05a6a93819e5c0d5c905ff1af6a60327d4d6","isMergeCommit":false,"messageTitle":"Revert \"Fixes #3 Add Loan class and LoanRecords class.\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":205}}},{"hash":"4559504e9cfd446a49e274f1d1d7ec90a20ea3b0","isMergeCommit":false,"messageTitle":"minor fix","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":205,"deletions":0}}},{"hash":"3b6e754eb91bcb5ae4daef398e62be03258bfba9","isMergeCommit":false,"messageTitle":"update Loan equality condition","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":8}}}]}],"kjw142857":[{"date":"2024-03-06","commitResults":[{"hash":"6c58495f0d7410c532dd4a9533b4d1e9af3660d7","isMergeCommit":false,"messageTitle":"Add developer info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"1243ec8fc9b0c3c3dc65a40282b83f604c4c37a6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"ad4b7d0f93d2a9ced885d29bad129fb952bdcaac","isMergeCommit":true,"messageTitle":"Merge pull request #21 from marcus-ny/branch-update-AboutUs-marcus-ny","messageBody":"Update AboutUs.md for marcus-ny","fileTypesAndContributionMap":{}},{"hash":"f36fdec8ff32dea0e9170cd5389e525d1076e192","isMergeCommit":true,"messageTitle":"Merge pull request #27 from xiaorui-ui/Aboutus-xiaorui","messageBody":"Update AboutUs xiaorui-ui","fileTypesAndContributionMap":{}}]}],"narwhalsilent":[{"date":"2024-03-06","commitResults":[{"hash":"319b2ff3f2a0368ef1ffc897aaa2972b6392a01a","isMergeCommit":true,"messageTitle":"Merge pull request #14 from Joseph31416/update_joseph_about_us","messageBody":"fixes #5 Tze Tzun\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"1decddfade9a6cb0fa0e2eecb4f689dc6c099065","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into branch-ReadMEUi","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2ab4f18be1b172d61a49af6b26d7d5dba6233630","isMergeCommit":false,"messageTitle":"Update AboutUs to include Junwu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}]},"authorFileTypeContributionMap":{"marcus-ny":{"docs":216,"functional-code":0,"test-code":0},"xiaorui-ui":{"docs":84,"functional-code":0,"test-code":0},"Joseph31416":{"docs":3,"functional-code":198,"test-code":0},"kjw142857":{"docs":15,"functional-code":0,"test-code":0},"narwhalsilent":{"docs":5,"functional-code":0,"test-code":0}},"authorContributionVariance":{"marcus-ny":9352.026,"xiaorui-ui":475.32178,"Joseph31416":21533.23,"kjw142857":24.415228,"narwhalsilent":5.536333},"authorDisplayNameMap":{"marcus-ny":"CS2103T-W13-1 KYAL..THET","xiaorui-ui":"CS2103T-W13-1 ZHAN..ORUI","Joseph31416":"CS2103T-W13-1 TEOH..TZUN","kjw142857":"CS2103T-W13-1 KHOR.. WEI","narwhalsilent":"CS2103T-W13-1 WANG..UNWU"}} diff --git a/archive.zip b/archive.zip index a69c3b56aac07e316c4442c7ec323c35506a28c7..e4ab54b61a24a67fd50f5efb30da1bf44dd5013c 100644 GIT binary patch delta 453496 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
g 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� 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%0Drbb2l#aFf2YMoQ-3UB1ZvBZe_CEg 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 z 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
)?ht2GQfP`*XKqBmvGiIU%ip`f1a9P4K9Z|( zZ|JVk_W6Qval0*d?5PK_`mR_X$%Ll8))tTqJoASY&s0oD`(@z0wOVV7v|TWFVWJ}$ z)pywhtS%OWxvTneAr8k{8j*H4u?u!%t-l}LEuV6&Cz)?Z&E3q}&@mIX)@2gkC?*Fp z0|k4yAyy-DH(Xr~O>%=(leAsuhjiVvQOxazxOX-ZfiLobHxFZ0xq_v`Px#Ru(cEqB z5w<4=u8bHf2&WOxC?n4^UC9%h=h5B2XF(28z?PO>^+7vi?&PdS>yGHyZ7J)4xP@;R z1Pu9sPA@?p0Ge;~rzypKpyN&^mZlA2QhrWp`)69wVuc`#jNmiq2==Gf%e|NS8s7`P zE{rovXTQ?X_CPi>_tNENcX$9V!&T015&VZXQ-hsB@G8NoUOIKZ$F3Z*L&wQ#rsOeLi*vUkkXBS|nojL`B+shq_42H{POBtG&3OI+>yQdGiB)UKnQTz zYP>GVG0@|K7hf~7dn|*DryvH&NgWbj($_ay?)&0?gL#3)&+k*!7IJXMgRi~{{hj@(x?Cc delta 225074 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%0DE|T@?DbW;t|W#NIDQ7Y=2M zt;!U;HVKrwzKH=^6~_8@#q9}r>kB%-`-)lOs4~AhY0l~UaQ2bONIYtJq(5ev$eg+4 zqk;x(ad&Dwf^LtT3vCl#NXLB$Bhb<1iRa3b6^Y3~gBU56m@BNW2tMbHB6!f0M)VgM z1apt|JDC(CF+i)9Fl_O#<|sb4i#A*egR#Zo$#9(GO|$|QQ>b{lBnQApLHbvDv^g7> z*$Hu^ojdgl%8~z;dCQEP;W_U3Pr`^`FufhsI_)%hD^nYhRxT>8N{Go!QI5UIj(!eN z(%i;sjK0dw43vPkTebo|j2h$5ryWPNw=h*bWU#ire9|?*cGW30unwiIQ}(4^GxG;Sl;grPKWkp?gx$gho#I!I44AG%jS1iE46(5Pv`n zYls#rK!8i@&w?XcZ+v0((thH&4AL=CpLBL*^ghPl)-Y)GfQU1EjZxPy_NeY!+isE? zOmBTu#~P(kQy#&~GnEJXdY^HS&_H`OXBBlA(FeHG`|HBg?^QY!v4ICv<08B?wQ8388h$$NBIqlVA;u33ldAAp__^BbCKH9Tloz=(gLoR9bx|@TyHqaJkxcc97lEb>Am-I#r1`k zIPvZ9&|QHoB1>K>_|xhxvz%VrSVO130yhy?WX2CJeG{74I#UznmbPpX`6nC)L7vlB zsqBxWifmC8oKHQkPy-%-5rA-k#57nQ?^*~sF){2B6@ ztP=vO|9$XZLQ_3SUWHEsgPU6YR9pOi!JJqNI+E|K!e63M)dwe+v^v25>^STOx z#P>B-jqg)*3!KUDkIQBOfOBsEePld_+edX8v`P_v;!dZ$1hjh-X>=f?? za$NOPIh>(K_SdwKGuFCmfr9zr{3P9kW;+xR4U4+4X;_ek}#=nD(;S1(g7edbR0I%p}t~IHJV@LvJ6&F0kux1*cwHxhu z<>=46Btf`t7{B$cmr~8)d+Mx@T!!H}6S1;z+^{R7iXlHq9ZFp77bX5PQ~Mf(_x-*{ zNX!JlP2&YZvtJWh`Ltzfy9%hu=6att)nKPJ2uVf8$o^fiJo1W}rpdyioKtE+l1|+r zBuHWYyMOq2L9WOYWsclJZ4aIqG>?aUo0L`@MIE^}0hjc2WR1#S-MN>9gUPH}Fs|}& zZajBAeJ++NeP`x!l`@CllRDXRg={6AS=g!o&&SHPU+3#DkTDJk{P^V{Xyj10u4+`X z<^i8KZvbUi@=uPgU&e8FYQCuWMbNDV;qjDlwfQdc7i1PktxGyw zF94pBcfMA7EK&>z>A(uMCT)2ua^A;p?s2aQ~vYHIr$bmyw4Q@f?L~V2|Ee zW)$bs+u-Otdni$*ZnsMITme!-UR>+xu`23U4rIyxU)k~FhsyWn&#l!E?7xkzgovZs z1fK~z9$J*#ZzLV_#t%gd9FJ-ps5R4o;=Y?(;3Dj8d5H&CP8S|g77^NIw^wIzCIXJ4St*c!|Sd_MYZdeu?@eM&}ek+bC!&C&6Ya|{S4`Lc43un_$OG|Ya@0oPVo zdj>-zB^Fu1Z{h}t`gcP1#iBbJ<=o+^FqM*LzcZD0?1>TFPxj#Y;wBX4hbv?c>w#LU z$7v9Bu!n}~Uoi#P;)F=>v$L}BOgJo>j$vgIydY-7W$md%P?%t@sX+Jv?yS+rxtpdC zm91%eaFqhN8oej+L?+J-&3$5g22=nQT&UA{9)7crQ!l=Wk;bD?&V-KmYmNFoy-P~! zn|cyuRb%=`@om{Eb;viX9qp1ce?gO(tMe#);%5RbI42AH^!kgM4VLTp^qftY1)eq;f zjhQ~~Drp;5M`$nroOZ@fcqvu>(2YFhj;Xe&mx%!KxvSi5O(AR{3;m{5Xjm|R1S%lE zKhs3inADp*Gf>R0mZV-MSzI?0k66y?Bo?*Ttg+7*rgs5nf&~MK-E)GUiWG0o!C@#M z*C)S2Ya-1-9@{m%z~QVZ7HnWPtXtDe305XFfgw;;A{`O{n4S9uiGUStSb?2M_=|XO z4hPrMny5_(5Dg`|RZHPxCe7ITcnbqf?sE;bnh>k;)*4b(=PqU>sb>s^E=U;hxkwo; zQ`kqE4nME=CT3&KLM{pUT{;D3a{H9RaFUd&6#6)`#vtV;i?gD|GqAKmePa^r>F5|n z^yCtI&zxicqIv?#+4Ee6wUFzw(^blLNTmh6Z*t+kuqISoEJ%xYm$PTuFHy%BdZ6DR zPybN;MfoT|L7EV=)IhS7mo=cSLm!ec@6DR57?X?viraHRmWjE5E~!{5^6XyLj2d%0 zq?dCCNA09ug7V3OqM*WL9Gaa-8OyG0^$6v`-1X`Lv=)x`UNh*b$?r1KAsY4+U?3jg zpn)|wGo(!K6+SFygS9%JayzNS=rn@!ibOpK<9RmjHjexyr>`b<{YAIn`lz0WbLx4%W z!Aym0#95M3lVfP$kV>Vui7t4=%!8zRNGXwlmr-GY;t8&o&sFhmun7yz_MYj)ctg5b`rgb{Ip87I#w!H)`d|o+(ep@ z#6Buq*9Rwh7?8Gb6erpX!& zu#%m(6u)9FJG90rjyLSz1a5vH(qD|O_)Bcq5EG9~rp9Jz?`B#IO)A&Arv4@%mvi#e zymiQqFG6uByJ)Gi!+dIfjn(Rdd{|Ffdb0og05L zas`iRox~e#5*+3YiI(zvu}>Pu!{I07Bc=$4BehrjDs=J>-d zmw;JTGGnM^lT>?()cM%GL|IV-oVnyWFM+&Sr-+5kwtw*FfaZ22^XB-V=7h`QXt&xhM<^CuOPn_h%ZI8>RsoFWLJp&u zYy{2MhKOilg1}IDx;ot85i>4ivJlIr87-J=lkZeBctJ*}V9r?i6GvssmPP4Z_%2^w>2nT)HFcI&^ zBS&OfCr_itS;YQH(CYNgY}1f|Z5Ahf(AY|XdC+U8Y-yt?JzlAj#Z&5mmPHI+hv#co z#xq@p@%D_X8>3y&MBw?8By7Z)nQLxOs?^WD%D4{esq7+( zw|`0F#W)qa{ynV`tpQZ+=RIVB)X2AMm1p?Y)ze5CjJ|yEr_AbKo+Wm4zWb{8yOCmk zes|mcAbHFFhEI=OPC&SM`|Bm1Au8LxWlY{B?3X$mYVBko5zYo--C&;(im1FUG11ZY z?y*#?Vea=h33q*Qxktu{F++Ko{elbIWt*^$1>uN+#CR{8V1PN-)*Og~*)j>ff^Z0n z*XJxTMj8H;-{4X3ANJ7UANF`Ri5;OszR)PiVKG>1(1`tht?dlZ{dnH-iNfXKsA*oe)f|lIUeV}FJz=w!ie+ZU}ngwp> zS$B%OAYcFvpEEekd$9!TC1h;DRBp!PZQ|=n4m`9>H9PouTZ{5xth;E!XUOWEtbfT_) z@J3;se|{;v6knE$Ds@i!SMWGar0<73YP8LfIKVp(co)o?Mw@7Ft-{edUoMT3`(jVA z{I~{{v`h=_sc=~S7l2>WxrDP+e1rzJO%womw3YTsjQdh|-222F`Y`=$^ax2_g=32gTS&vE^ zF2K{-{l(7BFUR_t*z#$IU_=76u`2y@tp+ZH#8j-}PQgJud0TkIvh)5XBMV8YvB)vG z4KpZd6ZLs#GPQ#Fu{Q(6mMt#w(px${`gjM zu6%!wTEHSn=+fhXQ%IC(1D#qRlR+Ga3xJPMA5%EU6<%4w*_kf;;dy#F+WE+dITFM# zLTOrAnW>+;Yen+DNmZPtLmTvd05Kel_;GX|hBZdTe~PD3muqSAKC3!QUh!t}ydA|+ zo9PUJHHdp@`+=kXjZCUy2`SYdw&&d(_qMb=sa!kdkn)a*u}B@gwx_;b%n8imH=wc> zA$+_S^f%Dkw9w7lcB!IV$M+Mm(=21c7*<`eC+>3xLV#HKc%%Um;xa4@HDi#CYW1vf z3q@J(9n=G6&MSNN8uY;xSI})mk-IcTQ&3%J>slfQCC@qZ*lb9`cSAoDaK7E6?*%g8 zwU!cC9Nyi`Ssslthw%*WZ?y8V7;tux$WYt7nX<#uuLwiXHxKowUhJauyM)BQ%97|2 zCtxDXo`-7M1TGir>9`1&#u4U;95+yOfG0&Q0`rr-zbaws$59-a!Z?o6s#SFkr7I9{d`qrXi~e2Y&X@RS>?A4Gr=2_kb(NeE%iClk^QNgj1so@eG& z6C!h7PA@QU-0jTB19!_J2lvq&K)`ZKz!DZaUY{PWO`lBUj7a*r9NHzWa77w92)ggO z?3aMQtm+iMGZ48p*9hO$7U0gUoiARo6Fk04wJJ-ylT(}1!~$nk{~&i2kLWXYe+4?D zDvj0i+`FK<{#(md@rt*9b?^59h4@mF&r@3T(DFCDU={Btn=P8;--)xeV*5iGR@ydm zH03qoajJTY3|*+8{!P^87;?h11w9tq~fji)tH|faLFdzhTjG3g@9oK^Tfr7t7s;CiDc1!8-Ek zK!a0&@>DMCoG;=QG&84@^Lp@pbvX3s^rJ-L7ai-i9-kPB0sK(Ui~G9|_sp;a&ynUe zt-6f$Y9Xa-v`UUfD29ZIqDD-m&yf}^A5k|>KCST}dJFnYj`KLZ=q~x!Qmv;g$9@L! zK)6MG7X?L%TQbLu&;Uu_Xr`V~8v;>Ncw`+fq*H4cgS6?JtXv&#(J=m2Ep|5E1P} zE_XSZ8?7SPKAh6VN(IU%{B~occA3J*X**AORC9(oa=f~QHhaKYAV4!q^_}!h#=E2J zcJ4axrfF;QtLY2!AGR|vVkq124IWdg{=eYyfBdm}_K;vHR08CfDRyrJ;7zd@VCpdc zw6Fi6-r~D^;(;5t}smmPf5%m8?)|!JMrqsHA`)XgT!R-Fy ztNpgqHbn!#WdA90|C=rb@E!E+q(x~W4F%hg{cle4l-l3qa4FyE;F?62!60D&g(Lm5 z_*VZW$8Cz+19SfPx9Oi2I7Rvt95Lm`CoWu*$PW1Kzs&zEx=nJY;N@cfO-KA+K`(*u zx8s(c83N(I#fSrwr+jb1Zt~-SVE^_1MEVGS+iqVSAkhA0YeMpbfS3B;@4wx;|1}0T z=?+0ifqZZNpE^Xy@tUqiAe8^J1OF_%=OW}dO+m8|!~Yc%|HGj!MaU6SE^SbMG{tX0 zxGDTk&SWw2A5DBrkS>t_HyZ;JoGd}!1rcuq(w znr%cayNwfpy8ng&P>tz?XSBkiHM@gJ9b9>ic&A#J-^PG2?jlC+(HaZRQW9>wRtE># zvm#AxuPv^3Q+k#XRtEm6+FbAAcfm1DnqM0Lf!xb=|9IbCA&{n{2dup`v1mpfHXJBp zu(xejw1=;7_@j2qJ1J25&H6DBiG;`gVdBL4@gC{&7+idG@9vsWXxniK7pp|L86xX)GdLd1*M}81;Uu{qz6-;8XifcaWaA) z=e3pl_V{p80br|mlI6G>RuEydj9RlgBn!2qV=n?Fo!MOA*(f>97#b z+)e#$b&w{RIbq)V+LD%dXu#W*-r@H7-kzmPvkN`6bLULy#oKinai<>*9!vsZWs2aHXxkvy!TPL&u+9-`feoxaj%AV z{7UOfe;w9!SltoA+y&P!N`ea`4gmE1{;dbR(6C1-ywu~u(kpLO2by~3qm+fI6` zDTUBXBFgRbd3HCjl$uEVEw^C2r3>MRn*)nf6o3%LUayx>6HWck?pQjFPIE7x98hMH z7DPuFb$k6gWK2&vVA?XwKPfuw2hxWuW8*n4O6~LtC!PZg1;exX<5+)Gx})bC&FBd5 zX3&e9q>3cqKJATMvfM4#@M~Dgy(=4`plOtujE8kFr=_CvWuZ7wFh*#+7{=3FP!l$C zWdM#go2p6nE+tGbJ6?!w(6~D z4paKI6`U{Uc9+#C!z#S`{!McbWpGnw@<#M?$q2ud1jX- zEju_NktBhWe>WMHv5I0+d?&vTIBEk^ zXB4sz>Qrd7W#qT9J&7sV_uDh@C>EWKg96)YHWDZDgOcJ@6|c!_5AQ4k|E#i>hp(j* zhxX;lh8UN{@6=^3%d<{j*RPILh!T8`CZq?pXBEjGuw6Br@_k#}D#C}C z*wN;!v(|kv?I^gK$}Sy5*F&HxI{_kk_Jbv5+{v!x-7Af657UujhyHt-T@#Bf#ypg|HP8KmA! zA{t9;)_2m#jtgcEMSnx*nZ@W4YR~5quhnQ&=b57HatVTv5E2P0?{ajWk;-7}4p@|) z=BbI5wJCX;ilTS;m;g&uxzZp!a8)uYy(od+yD6(_HDaYKMMe4${aij6vB}$LBEa?1 z_(W7Hiz-PzKfECACkEsuc zBiH1;<5R&U*+=SQ9$i#BwGL>JlCky0+NY%K=(QjEEKH#f~w4wM_i7 zX+yeei7^Pr#jJ&oA+^%5zUxW7}8pQh$l6zL~$O5 zP6;$aXa!xrg3Zh70O6KJdwf02prN^f{|Dqi8^0hUgp3MUK1Q|ku*Jh*Rw!1GKFiKp zm(1u8BV^?%1}MOSon@CPC0lL=-2N;irf^shE-gfOKIUk-ZnvNE5=rX9T;A`$!1H9?g&- zg~*CF0-{ASSmVrc2N1k!la2NDc$zxcExS3%uONOnH!v2<3YJ4DLrh!)S-lC(-Z8oq zl$Q0ZId~G$i;aDjxh{0e;_^7Ov)Z5xHnF!XIL2d5492g{>2rT=%>4w-)(Z-^`wtH& zjOo%OLvX_b-&^Qw!yY@*Qsr7YKxhbLF*soy$E}JaAeGF-i&VlLn`jSryG=g+D+Fx8 zlx_B@FcW4%Wu({HyIf>Y=!J_|>PftOtYfXqP4WZ%)^A_T84f^SltE#W2$Et6hLf+p zpkUBQa7;^VzvF-5TX7kl_TtQzimbOZA8+ZuLH4QnwR7xBCAmE(8+1uB%0jiKD(wn? zAxjL78BYIRx2YqKrU$z8Q*P}ih3I49F2Rk#)-knonG_MRSTjK)I?qy#`f9aJsr)Nw z0w({lj;Xms1nCn>@L&}X=4?qS&P6JOz30@Q0mW7iFkOFjhL$;#cZxHso_yCHij|2K zkM_}d;BLS?MD>MnbS5bFxq=xzYh;~BX@!|Yq{!|O*(NJIaVgXuqc~V$9z1J)WO{VB zKV;V-^*Ebna^a!Ar=EPUtREmKZ=T)03j4>~Yj;@czq-nf4kXygJ6B5tW%={?%dw_UEiacLz3<}hV^TPNpFxK*J`FUs2 z4njE5!QL(BRXe*H;q_a7=snL4IuyP6`Y-SPbaL|k>-TR5n@iie>gAu_o}HYWy?$GR zZF@?s+fO`w^ZMkZSv_%c@mtq@^ZGAuPfkwXzC9gu(A>N1b;FPQ=Fe{jH#fieFHlPd z2%zU-H?a)>0MI=E08mQ<1QY-W2nYa@B$shX0VS7i#|I9Ven$fmf0Elqwjla`z9L)R zJEDp~Rux%Qx>P@$t(Ih49?90Wr0wY`E5sy_B;f)9HWH{3+jd01PR#3hIX^HT)?YGf ztxSL*nP6om2-%Klb<3(EfxN6-x$c+ipC2rFK7Vla;QJR(pTB-_vIrmaA55cIyjv{= zd>p2Mgiqoq5%R&+fA!Dw)3?Q9BC-cp!~O$a)uO6R2dhl!i zL69c7NOJh}`cK!-Ub442&kOnCXrAXwd3AaU@63zINsum1pZ;}pKDu~28a#VD8lIiM z8~iXl8;nl#<>_6T-Av>3PM&_lZ~4EE&YrzIo$zobPUP+Ef7o#_9^_G)$Yb0Sm-*{7 zjHZzYpYt4dJ31R(49?C6XAfcZn|mFZ_Bz zKZR${St#U9o-P?*F5@WRNFCTwz~fki>|-54KOVy=f5C_N+JYy1hJ$Lb!6-S8VtL}e zMF$$%V=r?=<6iGBi*opoMG5=vyEkmgv$F zo4p<^Jrr!hrGTd<(QGC%`0$8lX_18NA^UHy(r3pkp92K%<{V&}7a=S|0uTy-4h#n) z30%QMe*h=|K!aG^ikQ89!4_#)#6tGj9gyU-$l(zLR(dP4ySa!L@Cyt8lX}3*NQcev zVvHaL3;}?FOWA~oU~0kX6b}|~0rnl@C+SikRS1d&j6)a!kab_F192};HsK4vuyGyj z#sIv4!va}Ek1PaF6z(qZDF!TIc3h`lc&7B^7&)0BXeM1?t{BBtddT_k9bW(pkxHvr|LZa0>?Rch4^}2JsJRV=kVlYMNeM8 ze|<4{@%%kp(kPGM0B&nQlwu$NymTxlX*N5y0N00d2hU)oSu`o|<=1?P8>%)!P#nNN zzaj**bV+i{(+SXm_woQT=9b(w7z`R0e>OO~9E{Gre~tLRHRun5A&cfL7kr`7K1wt)2lF%~a{Vk_ zECKhDS)YAN2+U*lJ^}R3fKaUPiMQ}2UxHwx5FYUT?(Pm%gXKw5$P>W)6S)uNoAzK7 z?b-syD8y|Iiqf*ap&jo2&re{K)4 z84X5{Ed{04J1~-gh8-xiAX6`gY31p*$la<=MA8SMp=ne~FR&+%xA6 z4SHVJ65ZF(2@yJPAVLXy_Z4`z{)Y zP~&_%#NaznJu20W>4c05$J1LvjMXkP9BcQA>Q*aF`a zNHUh}ZGqI%*`Z@3RBg9$VI)MsJOVP{L@@Nm4==G?wDQR{?%PO&%=_L;EcCwbB?N|z z87WrN5_ZT?32+M{WSF}XB6MLR@7N0?jng=|-b|F|osei&a=(F{e-M%jBOx)P0TPmD zbC5os!Po37aqlLEyGFlG$jIe^$VmA{TQXwUcPC`z@<3#yeB<7$Y}i;UGExEDf{YmE z?u3k7ejYM%X(S_Nz?sO%OZak@-K)zez}Y!f07tiUDzv9pOF|oRO~krVE*R8c)`p;~ zhdUmb3PfKOQ7Hc9f0)^J%vA7U1fV~Zf2POYk&~PJCG?@Yf63;${d|?D!LNTDPs-po z_~X2hRtAkB$aRDBGfQ{PuA`~fdm7v%>0K}KxBHVLT+#E)&cVj~gzZX+rZW?`O$m7`c$Mx>$4s31k zt!22c2e}?W(^v~%t`aNTJ<4!)KH_C+F&xMR;i3cKoP8ZVFs7iGVqg%G%*-e<< zC8csGmplQ5F@Q;B`5B1GS5_(9#3%E75g+3;vEW(4 z=ILE+)kuUy80FRSn@J9+R8K&$vh<7@aR`8L>x&AVn1QUkTWJ4znt?u;iy$vD_qCh7 zU9D~5e>S9SpV_Crr|0VUjTWHCXYkRf=ee1^W3BgYLk;oD_CVmSZIkJJ!pCeD-HL?q zNqQ@o_ypG_N+eyyc{H2rfa{RRwF<2j?CEmZd_5WgU_)Zv0boNJzoH#ZK+V3R6b<&b zA_{IOR{S;+cet$u>>8uEmuW%~=tvKULd?Yqe<)clG7Q0|0B^yAIZNS-%mWCmeDaN> z+EAWe@AcLm^=a}NUfipM87BXX4z8Uojd4$7OezS_JVusv+!t|T;7!-+0b@*=<|sOJ z9V6EjvY(&knGmN7Sg*)Vfn1y-a-9CeZ#leEd*u|zKEcnA318G?a5=i15APmLd5oxx ze+N3}*-TW2xm>cC7YU#!E=kS{U}+$!xU(}Wk6({H&1-Y^DS?0@!Q<%fLXi==Ds{Zm z!L~t~Wt2%H{#J-25K0?{u@m@|UR|JiV14HrH)6vdXd@N0Xdn2Sq+iY3z|}^{ZF&Ry z3_zwxV6h7U^Ms(1lU)Ed0>=h|pU0v5KI2(qd7WWo*4aeVEbx25VS%)`X_hV&iJ`1A{b`=|m8`?F5M+OOVT&;PUt90fh6<8Q|5kI(N}AU)t^~v0h;r0?0#i_L(i?PB3Qz9k3x9)=)yuF zY|54~JAhlmz=n9fpo5=k_FZH<+RqV>WlCt2l+v2Eizq$uxbLhcTpqyPf3!R5Lpvcg z6jSssgH$J3@9CSDJ=_&f*qAQFlm}w0t_0lyz7Uipi@p{7;8_V6cYW`no$MK5g8o8X zQTRIrSz4u>VX9dnQMf|#odg-)xbe@`irBZX&R<_sDsDDbG@TvY%_BHqC78*ztc@WA zA&vzQ*w{MG4AZUi;DBk|e@1B`*)om1w%tm4Z5-8x++uRDP!$gpXV>!78of8L0YRZR ztsW%hYRoF=C^7&3^I4CePeTu+j%4>l%4Jm(ov`nA6{R}4=Gs!T-bg;r(qcBJHLVw% zaTebn6ywTX9lGCry_=)F?1ErwppkJmMx)k_TQhksX%UBtCe{sMH8dbhEU%z?W z$7>VCaUt`J5`{H*kI=&jdf~BNM@dkKWqF`jD_x;+R2#;$kA+k>Q)7WNF^==IHkQPP zo!F2b+OQ*(I;0XIrIs}iC)onad+7QUhz}%L1oxB8#+Z;!Y)TJpjohH?Rf~5II_bp7 z{m6!qC_^vuw_a5Re_>56;1{_R0ZoXP@_PI}QbejFb5#+Y>KU2~2sNSOqfYD}k8C)| zpRV8LS)ud>EhGU#R2TchQB@o184|LZfatN!PAndeY^azvYG}Ku3SMDk!Tcdg!t`#8 z97L4^;lLV-B|d>PTrzPoJ0ZOjc;jEvPvbrte=j8HkIy5ye~kGGKX?PQFHK&-&~JDm zV*E%|=K2fIzD&~`#TAhUC+uk)Ba9`mYZdTPanssb@H=2?QBG>S((fk7V1PLS8oz;M zZL->cFYy4^DvRRQ7+EtB`JF&Msuf_`W~C_WE$V~6jbwxYZeP8B>CU1ab&`Ph$d*u} zHLG_03#p-je-+NY{Dfye1-un#(>o!%l8SiLTbG0#3K*QII|@xiI2JqyJqb=}d@}vC z_5%|f@zGMAs%Qg1Rz*miqPu17_}!7!HddhR=^6vNqfzTgv@L&^P}Uxy9Uo#bn?O0; zn!j!HV>d!9(Ylyn z6bD(Ow3@I3vwl@(DlZWx6ETwHG}(9q2GA!`orTBpZCERs29^TP8kQi_g{ZhfNyIeV zYnwpze+J`3h}FrG(~Vg=p-e)!*Aels%@I5{(20@kv0VV-7mUuLg&h32o9JsR=YW=h zuYh#dl=_ZX2svp^*YmiO?#G>Y5T4jj)UV;rmdZYF)X_CV-nr4uF21I%KIz0Y@Wh6; z?o-=oW832Vj=lF1)OKI3{YfXjf+x1Vg3`&pe`$89*=dw)SX!J&!AC|CB~7$E=Qkt+ zYD#_dM8aU(%CKsNfSDD)^`CmvwNwOvpxt;83)2ZG|n} zCu^Sw)9O*BEk37j3|@t1a?!Z>PAKaW8_Mb*0vjdMw2Xhf!e6olnGZiIDHtP6zXh$Z ze+)5=qp85v5opH>cp9Xj>`Bxf=(}}fXmh2sPDJS8nGMM< zy{@~~cGNFDVnK#ytt>#z!`jf{;R*X;e=d@>kzO)guD4jCth$y@c`2dxb?ww8ijQO} zNB>f-j%JCrT1-@C3M8*Zmgp#CWWh^%Ov(48Xm7b)kI?wiH(v=AhDM4$EC%iS_<8+x zcltX#vtcnqv>?FlGcp5_^vqdlBC7U$M0Vn32D-Hr@v2Xylhs#ny)dQ-{y}Gke=H`Y z9B$e!Y*d3!mIqPQBi-=9?2)>g_iMv&h9?`5IH-Z)&qadeoyA%OE7gZP#3qFx)q?3H z@su>vfU_q};@F`!xRKlp&uq9GV+;wdHrvGTG`f;x2%cmT@TH_G;GqIliSf!Bx_#I2df;tGWaYt)GG%HKr?Cdwhr?;51Vtbp& zqk{nq3|Zl1#eo5R|NCG6$Cj*lgrAL7^1w3YftZsCdmT5W?8QMvC@6kJ^DdZkn@=l> zP?_X6Z;+4FV&a4=C(W2R}(jZLeVFw$kPTzD@S!VV-2kmX?x@c zGC;lr%Ie*jg0x40{n!MBFl!$|D5J z>4RpGk%d^5^zngBH`QUSvVGCWM{L!?$k)69S9=`I*r`2^!jwBL(#4_pwuxbe_%lhjPqu&i)?kQ^%Vge6WQX&X%qvo5aCDis?~KyAmd6&*O70T z)ON}uQC>4DYcu|C0<7W|e@5u2o2gc%ZkLXc&^$w}JEeE3T_`1Q!%;V(_BZ4ugT>I& zwmfJqjysa)5a}R&vTe z|MCB0dy D7ArL6Z$0k=-5LgZeYU3cS*e3p2x!hIJ8QY?y)e1ttDx$U4iHc0m@HMVshh!W7w6U&$ESa=B0{aRSnva)3q|_SdO88maYA zMq{#*mErDXe;T$cVca;ZRaWsj1amq2N0{8>?$oIzMWXGRT#Rj8xQV2gSJx^4)lgNDZJhJpH#K!oadb=$Z6A z!UA9gkz!9PQ_j zfVwFWJ+w-IZ|?=@ro!{EUFLf8u(q0tPW5XMkTC2fQ+;Tes=ii%^j11mf^;(EX?-pa zMW~yy&qJ$}?0v*QZ_CPK?@tKYC1E!YYpt`C`K@gN>xNcY)jbkUCBH@S6q8MMGz{%p z%4$Mge56)kHu8;=8ml=8bVfN_!rkTj^vdRy zc4I`cN&){v)ZZI+lRG}NN*<>Qd@nb$_>MJNFw_Jl_?ueKXfWtGQ`r0T~Xuis=TSyX=f z@dJCGgeef`FfI4!oR>aqm#N)c_|&d4uxdi7EJT|q>M>*eSf5rFvfBIuB_qTH#^!h@z*e`O&z zEgF%bzU1#k&E#Gs_8XQ>a&pUs+X<=Wg(CtR7tX6?qcJ?8;!_>1zZ+t1mCpQ*a_-i5 zh0&=WDIf9np44Vhpu0?q>#R;k+_!`g76w-~giBicxLS9SVI zH{udQ_EbQ08Obt@GMTeHS_t))nJEG5iDOiV*Tw#7iD&vl!zJynBl=9-M%5dMN)-~z z{;J@^-I06_q8k=tmBam~Yn05s2Lz)HpRKdVH$L`D2pC!=e0vOQL(U1se?~PFtCA_p zY>3No6|}UDc10Yx1bk63uO)%2pR>k4_58RNYa7S+5Ir<#l$o1V5~N}hWlh66KJjTT zHuE=XE3S3}OP>fbeyqu{QJA_9$0@otn&xX4Xd>=ntTGGGBjeIRki8pLW|d{Uh3rE! zvJZWcy&K+Qm4Hmher`l|e>gRkoIdBbQON%JkN^G8fBY}<`r*eMPgrBR#%lO@jbl`8 z%K@)>qP)QsZX2YbO>`|Saz=#pz%Hx2YL8)Uc-j_rjm+3J^29EytY?p5yKOMw;3R)J zT_>%828z}Z6q>8ZcGB^Py<7iAU zG?B848YxRa6b?mz?GtoJepuCF(OmkDA|w`YR{TcGa@89t$uWtW?*O0+7=DBvR% z-P5FS<1>Xcb*$S}T}tN+JxZ)}54TNg6$xT7&HHN^Q{_nAqZXI`tfuI@N>KIW)7|8L z53Q2FwSo@rj-Fw-lSTid4hw65nzi=BG1k zl5~xpJ5STS)5vMOPLyI$(r=!;-?amvXLc^oNjt5wzsSJFB@79Blq5{y8T@N_Em-KR-ZHvzp?e>v;zxrbE}yT`D$1*X=P z-<|3L>k7o$JiRt-u~|xVG}HNpPGuz;Q~Rv4*F9iiL!A{F-Ae7>pru>i4OFp^y=1j% zr=xDNyhm19-oH`$KZ3BzL+U8)KSL9rX7IN8{>{MbB-vqPmAl@Wu8gcQzCDJup^9(I ze5<}S_1Fn%f2q=!$p-9BOh#7u(;max5LS0$qB5O4iAgK6**vUu)i^Y{ucehREfXS_ z%Tz|WsGLDjzG)!Yby<{J0VxF1QX|Ns**xEs&UXDxpFJa$85lc*1NR)x|A7GP{>9wRgEYKNTknJh4G zPwKb(3S|meP&|j7b*|a}i-J`XEydjxvcJbv2Y9!jMuF%~#N;!N*r`!B+0P@Z?B^}p z$A#JUe{tbw`xsfJMSBcu!&eDG9~ylW*rqJ2IOV+_hZFWTB4)XdW+NU}v{*~zT7cf` zBa2P`VOe*^8D}gV&&wi1q{9wR)Xm^!j&vQvkI^y0u_>EMts{aSuFcLnPMVrEa!swt z_aCKYA*NK)H5C~J8{XvUvhF;WS{3%V0#+&Ee;&iyu>7qnaB02*m!4Okn}qL?b;9@B zI)T>cTMWjptP=&Cct#Bh@9=o%aF$qemlACG)}>L-yL(H}G%vUtUS*Xueov_;dQT}H3tR5pDV3NKGaf41 ze^w&vl}G>9Q8!(gM^<^HJ?vLeOW7T=qcX5En5R)7j!|t`M_poCb+#2I;;}Rv(!^K~ zBa!75d%@)j*+>=m>NBMc*}^HGA#$?Ue8n*MtQ7S*vSHnX4TDcawxHB<)nicww)w28 z8`@-*g1UY5BT^6(&IWsx zqhAtmSs$gU3P@&89r@H}KNVOa0@0!7i&d?e)HC}s%9>YeL(kSI`Ga5!Tn8}9A`|O! z6}#P_C|EMuJxNu8gqr^PEVmO!>BuU>_2bV}K7bPqR-J!qg$BylFrZ2z{Pm;9e;PXR zl#Z;@R}DEN&nev#dm-Keih0c2NeIozDv$N!&o5L9dq(D-GQ2n3*ixArvyNh2rvQ1K zUnfB*Bde58k6~@7)E^>=Ze*3v=`pNbqcC7#&(ol&XkQ=H&)E#{t6x@x>!Z{;jb=rr z9|*=XXtdUjnr~6*5e=;?D?0RFTY*v6M{o!ci!;?k0S50i#mR(zv>vsyG z<;?n5&pGWnn_RzA$63y)fAyTxE)nVaSsh`@nKwT4oZqqw`g3vn-BMNuOuu=~*bVuz zO1S)EkT0twPmf`($=A~*RhasOjnb(u5vBEc-9WLP3?N3HVF+4 zv(!$)f=A{w#6}48{)@*&nZz8aA^}(IO_~OCjG;-WEj%93u0fpqm>E`nsWpYY#iY9e zSWA``z+sN`N%u<>*gojv(n+?7O=K1!qyDT=m3cSXB%d%3cpC|3e-mKdsmwXte7ek| zMO0QTM^#?qfYx|lVPw(EDp~UgaDz%PQ#pOqJz$^d0$WC`tDO&~Sp<-QeSMYje-HWcec&)%RwowrOL>E; zv%3?RU6KOx!a~DJ;xZnxt}BdVaWwfkVTdx-MhoHcniqCBF|HQiK)<;UEa>HVX}K=l zHdG9b22&zcRi12GkXgC_4-Tq~FraI_A3IQ&n~QjfEj)@`g&3d@B;lb{T!Tc#G^rzy3W5Pxav1>=N3U1u z^h)?`G~*iISMkrgu@??(-Ke^7#cg!o=+c365IYjCJCkQug7 z!Ml^8Y_sz+_Qs}tmv2iTS!Ft5Fc*A@L7z*d{mT-1KHxCQYxdv>cqYh?w;v$CDCa$0 ze;o>F{|9mKQ<;8QZPwyFcSdW@t98JR6iph_;vNL~1(m;SO*_^-oZyjFPO#RdC|21+mFgy!b!3&x>M^X5 zJ%VZ>RuMe7V^H3o1~D?EL6}oj8)oSB-V$j?Bg?pMWocI7nkP2W_J)Z)hBwm6#(k9- zMLT={>}&{{=~ECWpOrEoRwU5n?L8J_q*RC7f2;B4H}3Umkf)j2sPsF!Zmz#MKQfp{ zd?t1+e_s_m1KKOpk-eO<*Kgmd3^~;X^1NS#MQVXfDuSmfJW#m$Jw(z ze+bsHVKXkf*-(cKQkrlX`_1GH>u@1M=iBQb&pd|F$s!0yaHEC!tfLcy*|}{O*NS6f z*!>S8Wz1JPj+e6C7I5wM2CgpnTToLY`=in7JbnbeQ7EN2Ca4VyRjV z6iFV%x^@U4Nrf_2QI*Y$bdjEDkrlPUK5TG;s_v>(RRBE};38jn3~!`u&G&ZFe|T@h zLb*4E?(Lf7`%26<~*qe4TTMZhKqWaVFwarJ|?d`=BdW_ zIm=D!F;d2Z?bb;4%%iJY5gh26f5Li3hV>Zf z6}+r&W5WU+l+|{Z(TqUmtgS<#r#X46@iKzKqK_UG2}IY6Q7CZR=oL zcA#!_0m4o%q&YQf-*Wcf$3vZg168bD%aE>R*!{IMr+785@6flhl`7plf2@np=wqrr zH)mIMZ>l~w=U*L69yX^|S(~ayfVR(-v;QF0>T`2W*5S76q8GQfR-c=5vJST$2Wn$! zwXRvLb?&6P@_sh!b90W?p?H!xRqNn3>u%Dh&dq65E;ef&XLA^{wK;*x)@-c;b7Yx) zOSPa5X2~`uVfk9J(d$l-e~bL!)JZPHxmD8DA(9uo3qWyQwJlg<|L{% z=4>*G9n_|6&W<`92;41Y-P*LxDO3lwX|E5-XMMi5vd?MHHYaj@MkARy!SyShLNUS+3UXjgnFaf3ahmQ@h&RvGv`o zI)2Ma_fesG;!}j88c_T?%zZZCOpOnGZ_T+;hZ5w?DN=`2;LX`mpFx2)=T9As1eo)v ztQGikK<^hAo_-kh-JBbBxXpgvV6$^`cG2OsbNHaMn);4e2iVuGQhF#AR9AKPQs&L+ zG>4)A=IoS%EA!^8e~*KmsX2?nMX9H35!GrEwS{&{y*Z1)H5P4SHCW_{rf;#TgGQ#I zK94~2SxC3^${ZHo%(ZQG`{oJT+SeO~{j8yC?ZV_6hc$=E|Gsqkc0Hk*hyA_9r#S`S z{|36eQw0BSrOP`-_IIHZv}>@`JZ#IDv;*t#?OG=_5Bocde?+@*N&xtLy8DGWW8jaY zyI(lvCUkI5FRc0^c?|1lYYR^H2)i|2N=>Qgca`oKgOU@j4tO4&3Vj#myo9~?=uok1 z4GTJ4>{|U+!y>12b@KafwlNsx!YKp7A&QMiP+d5a?3Txohahm_ls3`D-E~T=@EG1H z{(~af2r-E5MwT^%IR+9EY4p{U zE}Rl7+=ur_j}V>SQumCAp}7B+B8JNimg;*R?pYA}e})RWp~B*Z))1z&dwAMAF3c$t zpYe*iWK}quv@cw8BmhyS9p`LZxMWp$jP539;?N0EN!Z9ggeL1Ie zIj5b+hhMm)O|TB~HZEK;D?CPbp^iR&<_mM0ME8E?3v)um!5FbQvBBEUd;$3TR@DqV zh^P6&f1Jp0xb3<{7Ps{@UpQqjcnt5BzToLwz34Vs;le3d!RTAnWh72P>)FS_YtbK#gAf6>lqd(lmf#D!Ci#AmN7a?wrGnG2_U zhtJ@zy)frI9L!&P2m)))pJ?f_-BNa?LX><>!ruFlFmn#ZXViP0vNb%0cM8;NE-SJq z;yl8d!E^xfVAr-=!<HulX)^e-NCM=fz*p;ii9KfRq_X*iRmKDgGH>T;0jk|yn%yue z8nj{`vBjy(Gi-nR-P@0hOX{VPFV-g8 zY_wi1B9G23nWr&UIl>=@XJ=<+e}N-XsTCmuwK@s}Jul;8HjCsu!CLxJf)A5Oge`l? zAGummFVkW_iEi4*r8#|LYai&%d#YLvDZQV-$8SZ3U59lqU%3>zW2^2V%U&e27?#d* z@hN9V(TO;r;NKt(MPG#htFBu-T)@ss!Sk5O9gy(=8@ke9i&S|Ik#Oc*f8GEQgB??E zIb226|0$nSL$I=`)gp!E`@qK`u;c>4M6LfqIJhKQE(Hh@OCYw$$tv?zC~ifZ!a=Hb z@Dlb5SO}1d4Y2#?SngU-g;56{tGDkT~gJPkM2j_z$ zLc8>x5I2Zq*nEud!<%L}In+IUsNtlqgGPT?=rT>JWsR5=@X9@ke?!A!9KsbJm50W2 zUM>Z@01F_fKxpEX0w>&FPB8@$UQv=Glr0brJJPginMJoeSb@kR3ojTt#6dpR%U)*b zPeNBR__S0FIH^qwg}Y%aM=%#*0c#H8RO-gQp@<{wL|#J@pXGMqkiWF*BXSTa<sFz!vrFU@H$Rx2$->u9O9hJT!H5iKora(OkZu%R=i%?iJ} z)1Z7uTpybtDscp8bbVQWX3x_Zd$#Ut@3YQ^mX%hJj3f96e;4|O=NSrhT2d*O<+GlK zo{=`|d0Q+&YEqy>drgMIztkVz zyM@>}D+L}9ebb!4JR5qC+bsGuXgTFUR2z7UK`WHzisfv|>Z?L5*@$f}$FxXO<&b+QmH$20fAhb1XoA&Cyf84iXPDW}CA#+O64p#-- zc?yb15=Nh{*h|!r3$g-8y0M@u6@U{U38PNY^N<dc9Nbqp#k-tU`tbnGdCsR4a{( zG>f|^0jy;*`nv#XyCN&c1jXDuS`-Tpg3_*WN%OFlmh!j!7D=|=)^Z)z=rLtC#KoNY ze`7rH?**MpzCI^~$@+BY)K1uIv`lY3Q_GJ=8x}7ZPVs4fAU4zvPUGXxN*p1ve-r(zlKt}^|NEc+_+RYTj~=sjV@@>Z_ZZkY zHRwV7DRbOB=ITZ_G-vnhp2yA(*xj6%VH{UZHxwx+f*d7tFM*|-T%JpFE{~B2yvYO^ zY-9w8cg0>&xrN#m*G{l8Rq(AMB-raRPojLZR_NE``gPOdz|^K2^R*NLd~W=wNvvt9TstE`lF(5M;I< zm~d6ikX&3obkv;Y)BYgs#XG}6p0z(n8`8IZkl&^y@mL??341}2QK3G(y{GhceJGh& zROzj9Z}GF{J#<4-&8a@dqxp{9e|%9=rsP%Kq)Nwo%JOVgo!huyo!}?@`Q+qe%#QBJ z9rp=g8lyQsQ~vt$UXWyP-1fZ9Swi=m_uFU@p*I?~u|yYgT6lCzx-{qav_2+t)=t-w zh&h?3{bp?FDoP?+jX{sJ$1L5@GILIiNe1Du(!oIc)XBuBcy)>;(s}Z-f1_aTp^}-i zXWH+~hQcUP@bPCfya7pLbERrY(8OYxVx2f$+beEU1!GWbX=%rsh&h~Znt5SnH(IGV z7v|8{>_a&T`d_nXQlJL(nlEwAD#+mqO$b}gp)2|*Nq8($d;~p~1KsLs9Upl$yd3?C zTU+vc4pWC|AWt#W^eYU)e>qu%utGeNcdMn)U*nnq4)Vd(^(I7YsF{y%#D<*3e3cgY z6~OSGE~)OyUED6zn$QKpdXwVCYw{F7^_`yr(=6f4v?%diLt&u~yS$ z9)T7!SHvGl#zZ7yiWTpu@XA*iU(PA^kxs4}g&lqM{^jurdpTu*IB+c!j8GI5CfMJq zj{@IeC;>c|RU)_A62^q-_`;Afl~s_Tl2S4rMmmxfEsK1)^zfW^LcMKhcaOcJxJrQH zGxec6^Rc13KVRi(fAFjG(A|Xcm?L@qi2h`Aq)%)3*icH4#s0HEgFATx-RJ1UJZFxN z*=5!*5?KJRMw$RLMeGd-M_rDH0uZWYk?)IlYFt()<~wunh(YYEdx20Q0|8~MDK`@C zlb?7tR4%y}_60d?+Fih&4=)7oo;e;7k~&rfw+tUUIBOD77f zIb6gXDhl9vhORJG+gJsd)6e7#BLpdHP$S3UN?-ptPZ#AgABmk2g17|5J=&FjI-zw| zks+wbFGWJ}=872unlB>YX`rMB;aGVJx8SnWNurgrEz;rDh4!V4f5KZe!0&gkt(qsr zNUG9f5l7l1e`BfbW9+Rd{MITCg<&28vTV85@|9$PAtXB585SitmBR$pOx#s**9@a2 zl%}JdEhI9aK}RBPXqO_YbgegIY4ZHj_50|)K+RdcUc6a#Mt zA|dlMfBlac)i4Ig!2^=R6<)y;|8{wHI;S@3W8?maEMBQ+C+cqLIH#&4Hv0FP39qwB@6OlhlH%{c?qw}*Tk2g-_wE#j_ z9>>M@aonYgiQz<+SsE4rLjNY3ppNlp72AtvfAr+>>4eWV4x?Pz_Icp?4s{ys0*V?( zbx4ESIE{MHZFL~;0C?}<{=43ijblM-Mso`) z^<%+-b`M3b@nFZ&iA~uYC$;xjv~OaYV2$BN@*j&b0bM~uMG;Av1`)42>TG)1?8<-L zf5cIl!>IN`L41mG-13W0Q7%jQ#$!L7@FLrAr|&Vosl?CgFLk!xhodjb#J^)L=uK-P?2hI(;{9J5a_K%A26 zurkN`*&|tCA_U?yMcnmE3F}x{AP^H~3Fg(h-Pv7%%N(iYi3GG*HXNP9f}?!BR5YC| zGm1-F@5x;_veB`Sf-z*w$^P`wWW@2O~qe=I2R8>O>^A3g^Ojf1&@1#2o^c z?0Z*C83f&@>qKrfM{w1mIW~q@87#aECPXyVkv4Z(R1dnNej`+RMt@NCADKphRY^3X zkGh-4FLU5m6AY*@gvixtZtv55M-Bw@OC@Cj#oLcTO$5&>M$8?04f*4?&?_l^g%<8G zbdYa1VW^EyNJBwxs2oD8e;w&Hp$p`jv(^Ac)CRgYCTQ6u9jbfmNU)D5LQ9Hzz=pdJ%96wYv% zSoM+en7Wn9-8gC|Q3d7_%Vt7{g!X9|D$!C~g@NqBNB6;KR|_&1e^PE88|F~TZo^%6 zy7ttZmfis$FTgGdH-1Xx z_@U-Ky`~@h4y+Yve{3ApjWm9->0ET4&Rm+=?zoID*F#)2?O460A3kh5RXLyF!zMa~Y|IPy;ya3Qj&u<*nNzZ?l zV(}(~DZs~Bd^VTfZal*0g)%`3b#7!R*0oYN7BLncGOxLye|F;%zNCibSll=eRAdm2 zJGeokDW#`!wKB|tPNKgRf*oOc)&SnXo)vj?D~|i@jvQ-L_=<$t6I^NB4;b;5Fn z=9lRoPAxmMjXH1N^YMe*|@-tSa-CWqjFRFyh{0yKX&` zv7}VpV|XM%yEy#Vw(VqNJK5OQ#;36lYnoP-Yy`ASC|=>7+KCx|f4#17i26y0m-( zT-D7hhJpC(2arG{vL1GO`@^I&@C{Ih*|41?wDe1)ZKbe#XVfBFrAp}08)v`VE2`6; zvb9v5Np`?$K%dAWD6HzTv=0ACPJIjtmp4w688bRC0$K*@Zv97MoKAer4BH;)oGt|ej&EFVgRc4Ecm%kgVcI!2(SO9&t6ca6-Iq_je%R2mvf;!fF z5H}866gN=G{ovI<*M6KuXKj>aeT6eOT+(jDq28Jq)|sCxDEMTOvY$rk4eNedE|J;a z?7Oqd;2F7;siV5k<3E`3%m{@v2#TA$MJav6E`wbgSO zH`%aXNSPkDI@#%xf%Ty%MePAGHQLtjNUO(YJ=|C+~c zKK&kgHe-L^Tfh@+^R*&aG-IOU#8rw=wXyI?6bLBb8Lh|&6|4h>%#+DUf-uELcKEO zEp*CDF-$UP718qUl?}K_B6YNWTS>r$EVTmxYni0ju`K36|WkaWt1r zXO?Tm|0s;?vXkf)q#E**gBFb=OZCCbgdQG^RzSm$!r-YUKeBX9D+sRUMk_d>c&jZ` z=Y3>^Zo&{L&JD+E&hNaOOoCIRU_g?81+XVvZ++YlOSi#~`q9DUj8n1t0a6iGPy@Kv z4gk-&?+VEIS%EbD!gb{Kq!lBonOih2gKjz@p%NK(R#VMh$*PJBn8QI9isa|!xjH8r zJa3*yBV35K)uU8@T1x{LxoEHum)PcZ)fa?UT_bNvF2Nd0pOQgxkKsvgW!4|H2JFqK z;mm4b=HaQLM2(VWu|;NTe7Ih|OUl~RwbdMNn@Ct|1%v0<5kKrT2twmUw@~O$DKWl6 z4XTZtx%w{%nUsZKKxkg5J5HMT4*PK+CF5KnpKUchXe(!g(e&e)x2J+^+J=##6P?)4 z7;Zo(S5*eV`6MXU+G=r>kZx+c09q8uhU@hb&X0_cQPxcHRz$!a6zg#_7n703$fsbX zQbjXY4z?{gsA<;W%z3lz4_WHcgxjfg7foRG@Af{^mEzPrrGtM2+@!C_f*^z-G+Jg< z;Yiw!pR+UtHy^ttOr1*AoJOlxq7G;Isjz@{Sd$1%K7(c8lw5RWVRep+1Mo7F65KDE zOS0sy2g`(QxOyPc9*T58)_2$}n@`=6wAk4#usGVP^HT){?dU^~stX_S>rpXs=~TpT zzqNa#rBU=^syof_%!;BI9wG+!t1xV!8`|iNlxb~1%4Vx|bf2KZ9`R>baX>*A+ehI_ zS4vNy6?AqSAbjh5K$_+e16+!j%Zm?iV8TxJ5XIbAcw=FQzUU;x0WTqAqq#}Dyq4^g zfPV{g)p7T3|8gnzY6_*+ybER@fRy2@2Z#U&^Xkj?ztJ%ltlT?B@}WX&;bO`%s?ua< z3PjfrqR2s?RhH*Rm1xS`T-5~JnmU@_Y-XuO=nSsX>5cYg+!M|M>Ysd&{O6d)vWmy?_>#% zUk7_GFh|aapCKVOt)W`K+QI&(-8HM5lfVJnl(t$Argdfl5bYk>;;%+TE_9W8pi;N1 zQG=%;DGKQQ84ue+#IZ%V91RXA|x$l7$Y^06hV(W-(fc$Ih=orBfM z2xlN>#lJymwRDjr@GsZE)2ZZHujsoAY#j==Twx2^G4i5LOKL<20pd5eBIXTE70%YX zr@y`xAeE|M`N;g?j94mi|CW^*)^cI8aQ+d{a;MfT3Q!MF1bd7UQ%Ubi)Wb4!c-Dax zSSHbLdF~r>{F{15Z?u~oE!{4#W+s>nziY2`k9sR*bBVsW49oEHy_dc`rPDQ zGQf%Z`3P4J48uopP>GV@!MlEUSGqfoWi#0#eE|>9YsS6xt(Uyam()#;SIFtU*uM!+ z=!tOQx>7%U7L?~1bP3c?o+Fqu_Si#d@i^B7@S3y2b<4vH{bpEKwjlIiWQA*S?>l1N zPRMWtFrDGH(P7TK{OkOrLEpF4e@Cs7{`u?WybkfrdCEP+DLUMYZRS|Ujv&JYm}H@P zV2wR`6%|&UKA`gTJ30iuF|{w&RdHNzq-g}6+WnS^ATUW25gM;Rp26^bf^1JtW?do; zAVp3iYe%cPE#ul`8`-k5URS4t4g~hry8wwJnTXKh+Eq=L7#*a;1 z?6xfICaTX~Bt^aOdxGu3B7ghyax9wX0VLa5@*W3fZOVTXo;=U8dD|SoyGMJl(WC@h zC?NACL4)Z-)OPiNFv+Rb^^%t^{1Z(K$k#@3f1KU#;z`_jO zxNo-NwP6>7kkZRdl&xBh{bNAD*qFD_QG-J)VCW;{By&ph=5A_`ZUh5~w6>XB})b7Tcd=026zB);=79zC)@B=w^9{_kb`VOf)1bPxr@bqQwoj zOvW;G>WVvCC=zVLUs1n|g#_DCaiIthf$#H_SbKT>WFJ1%^z{Woav!+GIn{lUO6mY! ztw8l*WC6Ar(P|zMLMEV!rZ5IW-VyzB7AbFXJ8pu-hX&1?K&9y#W`9fsU|Ub1*%}ds zBvr{KREjiC@RYNVES<{}idpRH*BeRGjNS-BWG0?9k-$GVWPEL|Dxc>*b6DkA^Ha-; zx+Z_sQZFz}N6&0(NIZg0VxL`vY&oQIVH-g;&M`(^p(X zZc`veZ>k+^*EDW0un<8SI~@rZDIS^Y26`gD;5 zF&;iMa*sr_<*3!cfkjwcX6%49iK8j-PYpsF`sd?QXZYuildN-^3$zcG#3v`KF_*lN8Rrv)#hOZry$wIcpqzMv@ocdPz}J*Q1K4&lwo@(m z{vs{@dDzIqBoqS+4!j>)k)(1^Q&k?z$=x4#&Y?Y4JRa%YK1@Nxt3u|yw+-MW|CR4vEeJ8L z2)EogiUz?1nJZBpu&DIZWu-9T5OsZ&{I*i$?#wl5b@c0LyX%D#c7;fxwiY-E zG`b$&EZf?5)mtW9cK4I77T31a;;I&J;~VZgfVh#ia2DMy`IM)NBge zsne)*yLg(Dy~;-D;`oBgBm4%U>Rmnm$N)aJf%yueyP#nUl%`Y9fV=5qo0?&q?vHAe zq{l{98+z*=09D#F1^o>5VNpKF{QGLl%3$l{m@U!D(SY|hLl+5Ka#A9GoQ)Z#;gMTS zb_Q z`r8tTo!c+jadrq}Be18i-N@sNp3~pStk&x)y|lW@0Z4vCE(k$4JcyI!O@l)@>l}cA zb$3SDgr8)C4Zh|rMKFREUp$*amkiHhr6NPW`$d1E5*t>^`?%I4qVi#IG)2PP!$h}s zU4eYBE|qvuCYo!EzUJi?{UPD&RnTk}oi;m0IGpkW(#{KEb9%cqa^o%$vWBdU8SWR{ z&TTwQ4FIg;7lmk*RIS@y!mM8l{6eMHHpTBxry2JcKb)*$Tof?iMiG@MgK z8O75XArQ5#ha0+!RJK3aZ{%q9b)ns_}^tr#+u=)oSn#R9xrn|*jXtC)rj_P zg|)za+;!_}pc=Mp*@*p;t#fIMgu4&uRM$-(t>+Pace-BzeJ`IHqKI==C( z-_}1uVqT)(@E-+vG6oCK@*ewDtC$>GaB%Z z>~JGmN8tEdo6})0^KV4Zs+8Et%=HLz)Q2*$dFmr|?s41jo#$%7#qR63Ee|yUEdl z#2B^%#y#jjPf54T4<50wQUzOG9@40;sJc;>bU!nexBa&o^ z``dn%*+{d>Qov4=EJSY?B+rQtmG&a?*$3ebKlS42-{bot4*f;;I9%Q&+UkRII&0q& zUj5f(mnOIU#aS)-vr%Xwk44tk+6lzs9!J4@EiAw9?Rv_@o_W%pPBR>8fDn7X{!Z9R zoATQ&|Fzm|7xFG+D}hHe|9eYFV{EeH@9@2`7Q`4DB^1)Ibl4g_LE1O9NL@qtLv3iX=-RWGeC~bZ~^{PwLNDFEj zg-af2Q0S+^o_lhe(1d`U?hXTA)+jCV;kSlZ8p_W88x$v<=#;o@v_Fdfktzm{KHu=|n8itZ; z{7AEOx^Z3yy=LwD9?3hb_OsCT+b4*r^B(F*0Tae=KS&#w6IdOX?p;rZ#TkNcH&)&8 zv{Q}v#Ap`A=uqMS)@|oxkIUJtW5NTZmDy$DdnVr-;Z{vrgn~n=zX?Ou{Oe|G^(R^_C<^aU?h5bO-?Qb$K|%!nl^ya@PRCrikx5umo|RS3m|FirRVs_i zP?FmFLO#^kj8SAL9ajA)N509mKPaehA@G|?^!P9K&qh95fP=ix4tCSdFDpK}M#&Vr zou-drbu)Q(n zm733@6p%DWB=D8BN2iKpW9n7Iso@rwB$k1mr3IJ8;phyl`QifRsIUwCd4&7rMhBn# zcSjKy9v?nXOHLquIobQbxik!-G6 z^J26g+Y}zcTK7mQic4H9if9R!_Za#JGZMk`=!0-utj{z>N4^eAKKJIErPmy2KdQ7u zh)pd^bkqj@X(YW;uUs*=uLvr6Lk42qb%KwAm=q>k0Y%hNH~kWdO1==9XxeQM99+_b z2vBeFCj^hp@YHYnffA+S{^G3h_xwnRx%V`Z5g)j|<2^wR>VY1xqUi@N4hsx4WxE0Ul^47d;!;t#^3K+tJ%!raYC^3V< zlE#8j0&xG(a;hTR?@eY)HVi$2w(&B{AsHnViE^)|O$zxgUXp*Y z_zvejrGId)8h^4j-=xVDC!z!n1|r*sbVCNa02oe`^^W=tvu>CvjwAkz2_x)shV(!r zSQB@*{FXLKJ%hr;1n^-BxYhJm)aI7t`2?Fyema)r>k z49T=<)VteZnD9-7Bk3IYiFc71!nFVLRvJU{1F1&9+bw5oNjLKUljMq|wr< zT+30o(qeHOBCEIBY5?3{rD)L8r_s!W;25CCpk zkJ^CY@xTyo?U_wZXS#1V&ek64#6IrXDq4v2+HVIzBTkMw5)OxMR+$bJmLYX2D)!?B zU+foT!4DJ++>5LawV!NmJ&qtQ`EF5U>1-^J5}?r#LeQ;=E6`sp>*aGWy^Pw;Jgm(b zOUm7$k;zdgr`vy@j5B&LVYlRPUI9mg^9^sTou;}+FbhWlf{MX~olNy2Pq2jPNduk- zp9Yu#<3vq7j#UexJBxC3)eb3#S$MTFoKQ0C=Bq-V&%;FtvkjTSN>88%9qo_>M(bdB zv2qniF%U*d6id1o_?&d!;WxJ=K1Vn!Z&-K!xXuiKNL$7|v>6cO5=O$^HbA0J^M*BO zy>Js*SH%;NaL%>`dxs=6+Ybp{>IQYYm?m6h&s|%c{tqbP`R&Oqw;#V%qRag(Pw?j5 zcPVDraQ+1Pv3Xi`ja0-`Kjdez-7WgDz02OaE&Ikea>1cM3urfeb~!|Tx9&fpNvhPLP)5R?VomSzgDA?05=m+M6?XG6cS z!DFH2xH0QQDMlNi)mL5;|4kOw1#>K3l515ZXT%ztP@WO^9)FC+Chh{JH-1hfMQ)ht z56cC`M8S@ADp!sJ&;jctmx%9#H>knEa?O9a=ZRo0r>y6j2LG+O>jiL8D;v1$gNon|FoEG`-5la|<;E{fzSPTH4e2gf;)u zAccIOrH_1c2J2^86#~ejc64OCo>>YIKFXlG#P6~HqqCzY2`)j1RE%gG;RSX)kH6OJ z{=*q-RkuW&X4RBuhh`3&v zUKfChxb2EKXkPiIJ4>Q>E)_!L7FFm@t13>J{w70vd=%R%;>=Z3+|uf_A$kk4LP4p0 z0*r5{VR+MC6*L36_Csfk(*xgWL*F!ZMY!)rV4sIsH!Gvw+#i_?%A#UBkrTfbl&)8m zkj2pmJpnHks|v`?l1=s-zeZ!(7yWR)KBCHI4SKng6*l-6&HJh|moIAZ^rbBNDjYB=C zS&bD2#dOx+ZGMV&_7+;{hM|@r!6+5!&NKJi?*Sw%fO>@T$FwY`FpkAA z8&(rxhAROvY`$d^y1rB+y9znF-po!aZbVDSkXPRA}sZ9N3Pam<@=PwYzrtkBFu0E z48#CBhX1r8OzG7HEo~xy&3=LY%hF7Ot!^JVsRaVEo&pAdk zbJ%;xf3nYiYRAX`VWU_k3iP%LTUc%8|580bRtTbvJ_i=`KQ;dYE#=ArMIj*nQ%(PG zXCQS%mG&tMbcu9lU@`uINI>O?Jnc>PpAiI(gxc1!4%@@~-*AZX)F`REz@|21zy<$b zNF;e+NFO{n9@hUqq`f>aWQ^r=SOX(gr+a_y2NAmo@NKWX2+;NaHvE&1;uV4Nk*FhL$$#7?;K@(|T_VIOF<|+>^Pp($ zM}+#rpB1m!y-)_+YT$}~M?ApHaYN7DJP>eTir zixmH_f&U{geaRvrr{WS|q}6GlL$z(IA-&80_ke9*g-A~S%%uMu@v{(EF#rptt+@uN zRpj5+e=JqpHB!sJK1g!{N=!hPUll(k^kyZlxae0)P!lm zCEyTkZ}-S1LjSFvr3P$!9vcb=)W2{>gJ{%gd1}B>|IaYt@uGPB1DeuAswk-2eubd) zqW^pLAKa=l1O+LqJ_Dt#J_9w#=)d6*HGtt<-cSwx4}C(?0FF9xCD4(=hC(yb{cpIm zcxyC-G^7nIgtl&Dw95ZZQOdShYcwV0|HcDo0^=3|$eor8#d?bSm7_;!?5rC{YxR~5toB`SIu zJRbm43E_&XLWdKq9J_9Y*|KHA4VY{~_jmHDddy$2obkEDojrCP7#$og_c;r*dU`%$ zmQRgBzBi})vUb4sxwA^pcpm|Cn_*jW*gruW3{gEPAt<0h-QED!yPtmeP<1y#GH2J!Q){2TunTV zI*MzkXd2gcNjVnEnfL8)Vj|ll`uOOt9YJNy2T5S_hOsSID&Kf1c2y`R7@k;PO7!Z1)o zeT>&koVUyHOK~9Kz=&)?jUS^#zR*^EdE6U65ws+mGrGf}SI8~ov<2=vZGD^`O4btA zRZ;5&K*XeAA^?lWH1eb*p$`kaW>za0C8WfEtR@L;0F&OgaNn3)kVl|93P(R>zc6El zN{=pc(!eAUvpYXHo_tLv7ku=DCB(93BpOsLjILa2!R4$MAxDQgjKkiM=cl2Ym?WiE zt;$s=6nc!SM(LS#vezM^AQW1c#M0y>$x~er;8#?grs@p`zo5SFmJJ{)T2b($u>R{8 zrRX`Wp(v-g(nI!`?nP*F;iDJ~^W zVrfvd==>HN6drb9!+F$E+W2X^oYsKV&nNrF4}K0j^1=x^n=%Lr+rWZ{jfP5*xPZI%_|3IY<6MdJ4hTw@QD|BAay#`O7 zymXLcgsFU`cu>;3*bl0?nHw4x`CYwPMJ)C#U&tK0h_#48VD|h^2L0sYbdKe6E%gSR z8E_x7;1!hu4jpVZ$xZA{hrP@x0mq3U5mi}?$g%PKIWEh)>U1p14+`wlAqmmpyR#$W2xIDWn?u1TJ>+9~Qu?eB}Hd&jqf18q+U#g;pfg$Uw) z^%l1}SV1Zr;0U!47fvmIjq6|NxCtW0sw*9C<3&F)vI+euvBkbJA3s1!7 zI}dcK>3G)mO#N;5)55Cas{q#qqp#c?#@g27P5b#`g6m}86#~%_7ethC0KB?CIf)mg z{TGG&&A#xJK5MQ)Rcp}V3V)KmqSSk;{|bLDS3`AG`qdb^Cu{JgY>!jLvp(^H{6KQl zbEZHHJYK@!vM;<6{U26C7_$-M`JzVTo*E3E|~I`bM@l-DJIKK-or3&)aLy9YJT?; zS5)Pre!8GH%8NW`V?+BiJAa)~(|PVjU0!CXX%P>?G3hGkeb3$t&YL5I^b zVSHgF>~%Zc_7a1)NiDy-CBdZ4)nQP6syk!d8x(5IRtMYWkVt66V*nl&Rb~yj)j=$h zz6GYw1+0pbTb5K+X2X^=qPUHGGY5E}1?uD7gl;&*0h4v0(+0a|H*+hbj{k@xGcS|< ztFQV*ZlJyU6n-=9c>BT10U(SOa(jKyj$@T`KJ3I+!S#(LUCwN}PBL5SL8$!I=4bCs_qc6qH=UMOF~e>OJWZ}!c1NuLmqmT z)I?;qUIGepi&byypB4eaeAJ@oa&5y50<}dn3lzf#;BHL(DN>N+)yu29J*O8|Nmjrm z^G+u0)tjJH3Gdai2rM0jiONtRrhd|v=p{khfzea%qiTuQegL}Ggb>Ia*Y6!4>WFG@ zPSj-{4IUpVZ-4)8d>ilds_{$Wq>QMXbh=8NvlLPk(;y7s*B@wqac%Gx1o#wepAIa4 zFUXSh=yD!z+0n&u?{e1r*s{mjLektla^&y;l&vdeMroqs{00%zPG8=_Aqe5Nh9`h@==^JYXma0|xA2}^IU4`D#paqbD^HM}2`X4qa<|(?ldHMm zjQBcs2LWn24{)NtRc-HdZ=ZG^i@fXM@nijYr15%}1CU@QM9^);MZWHPW8^XTIcjV0J#$g|94*ptRp6{=MiU~jOfuPe}PUe=>y#%9$)vrWmVE> z;nL3c`-Zv46~DN7=7}E$4^26Ryzbie*KgjPJ>MUkxw!>=eBRxexdnyB7n8I{7GK8G zq1oosxSGBas8`AS4YG4{Apu>!50_7~P)whf%SPvJ$f$IT_W(_46ov1o{J(hy`1lEP ziSu#^^8_JaGzthe@&)uEo1Nwte=oj`4mQPz&k|sLEG~E541(qkNw@!FPj*5+*mF68 z=N?+`8HL-gWgrDs&by~`Y`LY%-1}bXL(gFy;VO^ad!Rn_&!$N5&4T;Tweif4ViQV7 z{47^$3>C@D#G841v2%&Z_jg#Z0%{%%1Tde2?#zCbP(dvB?d` zdCz1q5cCuav*PD${)e#{L_TN`)Pdm;1n8fEgQ!qsfMX-E6OeRGVS7KBxXp_{dU!Xn zk1X7FO$o;$Fv(LEiQ6-S;{-6Kc(eyl#xwi<0i)=F`1iZ;0sy{|VY5v;i!~n);(M4Yz8=2gxB#MEq4|eTh zVb9x(@DJgoN%BWVsErxZbf((~*=KUaBso<+l()-EI{?`3`Dn-m`1;cyPH%^xesP5h zNrviguWiMK=qRhWaKb3UeU~uw#-Q2hF%&Rw^tk}7V8>=VCgfP?SmOf7fEDpeet)}V zhaRK47(gXhSnmhrjIYmXQ$y2*4H4PP^zk`~?_iJOTJK$a_uu(!C`SGw0T>O&c@VG+ zh$KfA6V@!6x4jR68m2S@k(QSa0e5_;mo0uaegS!*Zp~c>^HllQ)qM0=w))0wsIj`* zy+ALP+QXt(!VU?@*Zr`^GHWxum@bgo6vZSOIe;L+o-U8nFuqBb=owUn{k~!(aevUo*=;^wT$Wjj8H0DqpG4F1R`w zlYrKm>U(V8mA&1-L9Ny~*f3lj9yvC{F18Fd>~F&(x;x#L4g{_P`ZE_7kdAI2_lA~6 z-)^uMG(OQw>QmYHY#M^u1w+s}B|gCp)8MpipJi~tWK%1g}_)|ktU!QGQcYMxo(cfkHT5p|zi z6I}1fVU%d>plyKV{a@%@UmYnv&lO0R4@7M*Tf>BlMEux94R3aWZLBdh6C(H(+u==m z-Q?~TSxwN{jIRB;GvfUAfShZOLYFO%M=OW!v4{6hrrQsNvjcUx3l& z?rQ@2Ej7@0gALf;_Aj&NVZYiQa$sdzXC64;%C~S&=nRa^ zPf`UWmR-n8RSpij$Pk8z3sU~h$wUxKz`W{-Yk6OMBbF2u=RX;IL?ui6@%BQdNY(r4 zZ%jJc+uyqqa8XQ$5D-C-m*Wks;tlAgPCDoAh!JB(ho{KaultyEU%ivwm!lHrL`}BqD+)I&j3?vX2UTR5K}^e>BoBR&kwjS23*1vtx(P=^zw=6m9HpJT zql_AG8e!Wzy?9O!xuu{310^0=O-2viZ>E5^APq%dmc>oG&=6C;|6>W^LJb%$a#ELc zfB35#Cn42i*f;7f#3&v+kcxSVnsu5-nXV$N@}pMfw-4Wbh(bXYmoeOce9|?789~>p zmWZT>A!1(~G13G0wTdfb3v%%0pb%e|uU`A6rucSDyl?+WLQH2KEbfdkvgl{xZDEUg ziWkmLF5CX5bCQmj7+4xrqF{hFcVL>#J#L&>D%^*(aGtAv5Mk{HCMgBSrg{a>-^jR_7TcW2)4x6HxiYFpr&1mn|!Y@GYJ)XVMAj!^~ zFrl3O-ntF_e&4Q2yRb_LZvH(lDMzVXVMskBWa<){?!QN|x|>2x`wh?*{t6U12oG$? z`kT_HlQvWM7Xx7Bw%Imq%y|rj1fb}F1ff|8sqjDy6RmH**2>86N2tI!)jc!zX3SJ+ zH{WnwXM~!a%jJ@hcWLbI*|C=^9C40kZkE7Z3)=bs6#y!%_PZA}zf2v3Q^aQ{( zFwOxU(3GXLMWzKGkZEMEgI2^M`X0bNq{|SP^oMM)`CyYdk8Q%C$kYLu;^MH#T6cL| za@nT^sz^{?zbJ|?hIw+5&q&ICzJ3SB2oDsMSZJ^-4)#djh;E2YEk!^rbdQg;TjBQyV)g3xFbJq3ef(e6~V<+XdiW z5I1x0Re4^QN-Ik$x%`zTpEF?2?{NCm?33T=2GPIU2kd2$@iXpo|02nG+J>h-U2TWO z9;xHJWz7gdZ;68eY^}k)_mKGgO-j$tJa52n%ZIvx!op10m<9vru1`PZ_gBdh-DIz# z{Pgf8#Tw^aaKPqmvA;sghsIQ}Q>--5;Cz;FTqCiw&!mJOHnwL&@pxV2=TYfIngyHt z_|r1#59l?VaQ~K&iuZ$qMt}XI71jGaH3EYo%ve*H3pJI@h)_>nEb#@(!%JDr zE4;RCECL$Hk*c z*!MyzP^n=yCtm2}RgU?D z;GtmRS^g!#)g;$2maKU3$Wv?y5=88d=LIBAqqA(%82~dy+T+Q%xlgy0m4Z>^SxB>F zE#_7tT4b+`A8)N`XWFy7nFdW#^avkQ=dv*-2b2UmWjI?E-NZo-a7x1k2r)Bmpy6+w zp#6G1+DFyTVvdB%uuwa$n)eAnRj7wY{ws*^oiyQ(h%w(fTufCbOsO4N@vn?bxMG03 zV|LEffwb>j1oCNM6t`&2cREZJYdvtQ#K1zPGmfWXZMiG+tQa2BoabbscHWNu6?(2+ z!P8=N>ZkA6B83FqG`rq1zk)0Do#3CvON~XDhGe}sys_!1mJ_-vVH6+mGx^fl6MhdW zyb~jDZ`3DSxk^Zb1<^1)h6OkBOsWD*O*tUv!KW1XiIDZ$)7`Btdn;u0jSl797vW1vZp-Fc4Gj_eF2UT ztp13bI+!i!xd)&cR8fg5>Dp{qFEzqEm57F5P3*}W;jeoRqPWIEn;zHt&DhGwe9}^W zCllrKS?XP%Axmq|@Va9TLi_8Af%cHE53h%sD!6fYuF^{d@%<59MGIolCjBnU2j)w8 z{*?!Pm43+l)(;hlTp;G^p-TYR&>xk3*P*qojo_Dxs~B^Hah3XoelJN|EV>HDZ7smD zR4E0xhY)4Jmfx_6Q~)-RtFlvBmDA*-s4hBLB#;Q>d-U)c;k&tB6Gs7|dOywL^xzW; zJy-@AknSX`*o?p}Bkv&#$-hRzXtb%#{mf#9|&J_0B zlD6DyfOpt7Z$&peKYI`DeG*K+?9q7ptzZlpr)L65HP&kN!+J;!xdkYrZ_hJA5`Q`ezFg6yOZKih=5;Nk>9wpc^p>6Fr4IX9ww2^*U$O+! zB=i*75Hk~FktQ2%i?G1GIKE67ZX{RiTzMvm3=T)iVbPiaMR;;N@e#^SQpp?(iRC~BgI`Wuewz=UCS=4VV_=E4TZ^t8t4ugiF z3?mZAZGrFs)(_GyC}w=~DL7MDHC?#+*nw;(b*2aTkfB1@ESz*$DX`{KVLytg#7X{y z{^K~B=K=st)UpTlbz1%0U0uan6ZTMLj0-U=p$M8?c4VG--=z=PB%oo2{dxY{L$MGC zLM22k;USnqj}=i$gbYZhGa<)SA_&E&fp8Q;FF`Je+6(7OR9TM%I*l!l>n4R%#?jwO zoxZIZ;I3HBhC-Jy2B{L)6q**j)RyWNfb=ItQ}Y8t%Er#9)Nms;cjo?f#jb)o@S)K^ z#!+dOnzIQ0>`WRg^U}sP3NZ(Nd9}_+NZGetI}!oA!%9%)wbPu2OOaLLL88Tkjevbg zh4Wq|WWB732~_2&9Bu4MC7=oYP%D@+x8djB?q9*-PN{EQg~*nXh@mo^xj}l_MF`IN z3OxioWIAdXJEVBJvIdBg&}TAGGRI#Vd_4-Sx=w??+ZIPcFN7-&W$Uh~?+yTo;+7v zHU~A0N=5vqA)ln7_8bU!K0X8gO}{)fXx3xRGzYDJ%ayFgTim}B-K3X$S z05x1Z#`=uoS@kFkFQeQX~i7y@Eb>L81XZDO_@veQf8YmhrGZnbi+e*m$pDj zVn-(5J{zM!p)`1UZe@kcJ75%I+oXJz!Oc*Sj=Yhfb&eCuPY)8#4{5pvMT{6v1p(xV z7kyD>QfoRlz9jb!n3>)n8_75*NQDnZqd~DVZbm@u3<}Hk9Y=EV?~^A42($vAWI+In z0z@bKkQXC7L70ds=174Cxba9^EKfC4m|HSMMt6FLP=ZESLEfj}C(8QN(6 zb_IxKI?K}goKJuiinWm1JdT5!S#umKVs_-OO{R0TO&d*}0VFvGTps zRY66f-MZd)R{$0e=SZ6i=sd+2aHI>^6@Z(Qe>(2BPdT5S?9`#_Tyg+}{rm}>9cSR9 zDt{*+7V=%KAx@3Ql3u&`5en=##E`RP8rxXF5mQx%cJfd!G=6UXs&1M#KKtPzU5(GJ zuKpy&lkyI=tjfT-UeD}mNn1thRzmigHc1RHlwqwx+e8q@R=-K2r;Tn{oRL9X$g$Qd z3f^eQ{o&(Z?EHbEjp?)!5m*$Gafj6byd6gPe-q-SU0;Ln_C#j!uI5emb!`?t8s97jg&>xU9r@4Q5Gop0Lb|TeJkXni3 z-SUOZ$x@bdhrdQF75SHz!rab^pD+FUC;u`&eZ7x<1%BxVT{Rv2(pOKWEJUKD zKg)S#;P;GF#dKaQO~5((;ZJVO_|#ax+i16twM+?>fET~U%$&&bNmEjjGH1xwW$KAXzG7pvh+S`HZLi4 z?u3uQCv1{-wU0Bq<0&6H5ux+hT1xA-L#F|hrZ<+M70OdhvQL@L+&PjiwOxq9 ziYa0gi0E>>Rbl3yB7aMJD4#fKlEzX#G$h56hx|ArRvt8>t9=Q`9Wa=mrHN z4^XV4yGx1tfCGb4fZQdT?5uYoYcPr#nlP48MRWqFQGHWiuayFS3e;DdsWNi>>$37t zmP-s+cD5@zK`ISHLR9V0#uA|;HS)$=IgL_^$Z`f~T@I@CsxIuOwENLqpzh2;#6#cjt(2y!*D~73 z$Z8kU8R~w9=dF^ay4*C{xQ&EkiAn)rsfpC+0~5c7p_?`{=Uexr*kPd#l6h`LE0N>m zsU+)nPGE#>z#l(WqwMynZq33w4OC5FZ)m*7qmL57L>ht^r9Mf1&%YQhEO`KYGm~Q2 ztA1`-`7_}_QT+Yffv$JU(`sy@S-DSArl(AMf5IZt@=UGGsxy5L$Ziz6Mm5V@6T*_Q zOvlj?sxC`y8)0R6YN$TyRg`;AoZ4IWLMsgK+GIaW%}CGk^H_0}>;z-A>}Qb|;-W^b{PN&*|SDS^gl=Q!|iI zR%K>?v3c6te^P=1Hgo$;MG{3;ssLgpC%u5 z&BmA8qj~38uXv;pDTrSHCj)1CC4VpeHe@Bz(1w5>PwN^3sbJ=*_aH#SjuP+xV=dTfqjyltIj zXK9vxUBqYr2k%y{ZmauHZg4(xX-5hGkzBD>g#XPU6h|nen_0f+~+Dfgh zNKAAS$A39vAv0)+0?bIiC%0=@?P>XK;F3mIUmIv54Qg(hgHBq+5l?RiQl^<+kw|n# z9}i(;Z*wMo744viAkj44ipLfmL{&8Z82ISxXEXe2ldBS^RJ-kxRdB!6GFS9>2*aKR z=22roY_D3!@AZM!e)AUAS>=k)nc=Cb9qlNpv&Z;thDWJ83@~HMxx$QbLo^HHb1Usm zuGYcDXm6{7kh=|T`=Z&!cHLyly5XuF>TE8~<;B=Uid*fGp1#8kbsAXCHCs9pu4U#f z!Ao-Ru9wm@EqVz*Yj8SVs{iR%O}!SpW*4czBDnn(vMy^vz&#)LV6Q7yY3$aGC~LTH zoE3=X5Naxt1h|Bm%r9%Dg$^xfYoHnNjfo~>opGhepp%;Hluy#?EMa!uP@__M4Wz&) zOh%SXD#4!;Tc>)H)IuaBm*Ygx)Qp?`T)(0yMxDFQCye*Q4p2je%-K#ZyLHhRfx-32H%~o`cF{;4RH7&ralyagfR}@kuPB1&CVsTn=VYUR$~`Q6v!?G%9e% z3$m8gl@{86Vfm`Z?J4-v+Y=H|MaZh2)36r{Db*S`d&HN4!63ZfFWXZ3&E%>CoeoXT zeKp-cQcnP^q9A2$vF*uG-d?7SkTON3L*)0%lX2tCR4>BnknMi=^KPt4!H!RrM&Iuq z9$E(S0i`3018`QSrd=$yYxf6HUm9*h?Fj*hkez(CmkWvLss>~NuCCzLJ z`m3qZ)>$J>tcwCG@c=_mts62aK2X>;gbEwog|O+njT>tU$5|cH9tX>gtdMexravX) zz`xcS#Cd)=9_<|d_8i2sIeu@zCBzg5%pOF~rvTA=@=ec(s)H)+S8&13d4R z@G^Rpm_bC5Vo;%Z8Hmm9qQC7!zt(UUsgcP$rJx|OVA2xqFHYRr-~9IX z3f&XrXW8D57Z7kPWkTRjd=JYAv?oPRHb<&&;;b%lEe6_rYrdCft)d(dwqLVpTGWJY z8#Il^I(xNeH-p-P5_-fxAc^#Z|FCoJ*9{}0!#pEGRP&X3|Mqk%!z6|j&Iwx$h}CPq zzYZH6W~w5>XO6b{8sL)4JivMR%jyNqq|SEfEy1})^nxf(9eByh=$*jhpER@{&L1NX zP&M4lS`p;Evt(E2HY!sB77J`PpIZDMc#Kx+o5@IM{@yS=FXZw+9g)qHbC%TbQ^~NRjHhlVI~eO z1$srx0V&|64BLg635*TTgX zvan^yhLDjbic|feT3*gm$$Q$O(=euDfy^=ZNfiHGnqPT@pY+=p76}fYLH|yAo(8;B za3RA~GV|)0P9{9jAPcZ5z^y)E%sgVOmna@3hQ?yE*B5`@KPu1tnOcB*W^{Qw36)tX zn~&h!+Lvj}N)Yl%Ow(Q--5+O}bnL#pW-zPce54R7@#5UKC7Uud0#+2gX5eC%njbHk9KN0Lsa&l|8HdWsE_7rcIU<)QR0xua}=x`I#L2z-MfAS zt8<^|BMNQ35n6rt^Wa7}alWN>6_Q~~Fopa_)>gPtmQNM|@_fEJz3DenasOQGY8#Wa zK-*WA;LG2)S*Qk>Z0)ty?xyeak56DJy#Oi*iqnjw|Tz;Ixof#}%q18IdObg!di)-H~Q` zS@~HN5sroIkVIND`~sycST8UqoFR}!&p9d6A!4nC&i=|;DtRAPjl~bM0!Js}Pd{|E zgJ)$|kzerFEC25fz_N1fq$u6+a$9^;uDKcymCU4Sgh|pslH$Xe1_2E(Mr;=E;jDf zG;vZe=)WZT^3l<;Y6(n#6 zUol66>Zzj9qbDrcDztEK(ch;Dj_M!rPC+t<_nOm65t@`SS*Kcm+LyF;VmE&~(l3;; z6|KuIgaxwju)Oxw4J{7!J|zq{kmVgS2dBA@IlRU3=%kr2>(_gxzB;iy=hP*LKCu>Kns6Is zRvbSZpO~%RQS#J1Qno>mK0K*ln@REh^6BeoA_A0KY*_?zN|IB{YJOI`wFLfZKDw8k z&7WR98`;y+523p6PJmHVKEIUAvUF6fE?z+%)}0(1RC5Z5LM;g2TVAEC2tD4hXoJSE zsYkFAp>AZauqFzZ4~L!1&Eq{!b=b&TY2( zWDF?Pn+L&0PKr|um88Lo3k)w3i+R-YkiCtYgE3?n{vaW@cam=dN0$qm0$SxXb=Z@}K|H$iP3ASHTanH?hYu&yK{XJSp+ho1y^a51p za~0S8N3Csfv;qN9YlErQwq|!&L{OSK^}Hm1%%f``_!(bvnnFdDIbUvkE>AH;U;tcy(nO_4_Qw;LzU;@l`h2Me54}gi5MBko8PB6rqRjYZeQkb+ zu!#xpYE?o)PiJp@3)zV%`lVGR-uQhJ6CxU6K zt7PYB=w3qwl{4Nd8UGqo`lO;w0-r#@T&M;LLp~=q%tt1-l}(-|nUDW8_G1F*wGuV9 z>}NG26D|y1#YMJ-%^gv*y1AAk;jT$L54N&iK_%p;O3H5`1$lC#21*4msJt|zab-yY z?XuxlOL{Vc^B)Lbr@4jRL54-ke^(e-+32vS{@u7I+omV!B~#SVI~PAbNB(%5>rehxih0J$=j62ZBv;+{t<7uDsCT^PKux8%ZC1bxObglD`Ez}9P!_HX)?zEmkTau7E^{oVqm(p-m21Wj z)Vzv;Y>eUxyJOMCn$SC#l#pi5aHAsMlD}yb>=^89%(d6-Y zv8H1{C5t(1_NWY-GSrr)K@Z!02sYM_=3M9sl%G=S2VC+V*cja_-b8gWNVLX}7{=A* znxdFT`gj(3j*Q1ta@X7&;2;O}K(^F3E65wk@z~sdeZ)@#~Z&&9K(U>Px$LBli7ASD3Ze`=MWTR8XU3Fl`t+D{$Ox z9r{5R4lv*SMC4Abn9AfI_L=1pq;laBW5tYWISYj;AsU&ee+?1VaJlx6I=rFohs)p? za%8T-;kJ<*V(k_C1e%&)Lkr)c8!J&9nDecLdRFJavW=q#kdiZj#eqqneH*!~U^)kO z9N)0g)Hwm2Q8FtpkOgrOoMsSAkaJPa9A7YQH9|=;SQdKln&0;#S7m|5=o0)`D#S{a zeQ{8dnZ|h8t8nvl;m2-D!i9AN)kkFMk88U9#(xAJ%c`^t^B=Q&IYAPRLObAhcVB2#~^ zv0+W2iTh2Q07LAaXZp=|T5_!JY>K%~)bP*-|@)KZ5;%?MI+)u+n` z$az`Qm8-ESS7_+E;3^v0VjqWc(SwP8g)3cX8-1gkQ$Bu-n~CaOO2tYa5s;v{J(Qe> zQ(cM+{GQEvOcr*tR$7ohYkG|E$t!qF#(29{%4TG9HWksDQOtnJTjcNdW8)ub-1Ay# zVxN&_O5)fhl}oavb&1nVIBtL}Y&T5=P=;O-Cy{pBq7o(XwI+r0%*h@TwG(&3&akit z(mhcn_xC)O(d|zi@E?e~C6Q3RcmKsfQ>Ic1ol3|k3qjYj zbDbq0J~okACWdVU(!(m~m1wUv^~yT=SD@J8vQTC|v`H2*l|l)G(Yzzu)-*MnCn*7& zDZ+s)niA!qLHpZ%izzbJ(R!yEP@`C}rN&@L5kwQNo~awfD3xTm7SGj7*2tiHMa~r< zbSXE3ucJT!KTsMw@U^uN{MFk-6=DOI?njsG@5V*`-wqq&M>kHzX&5d$cHo&Zx|s=i z#y;H6mOc+OEz9mj3m9pwGdbA_e1#L4^9lULs|eMO_*PZ+juo70rTdX701-xcxdHq) zC!QDSu}D@u;@LdaB3HCc;}sEgyRZbF|hQ?uMy|GcePuyBorxzNe5I@j`mEq_cp3Dr6186C(xY5wV5)7hQZ*>h-3lI%4Z14^Gja3^q+||CqQ-)K# zTIEI$&A##p6JI+*#$2i92DTdzc*ln4U$k@bAzPMr=B^K(Y3*5Dq_vz4rJ@n6G#Oab z0h^t$SHZZ-L4;`Hfkt9Xku08p-9K@ga->MVZy`)>lJ`md(qUr5<`Qu~X5ydw~L8HsuqjG#-T1f#1aGRqQzhkLsG-{HX@6AbDv*d6`Wh^`AS`!+8{jk@h}Skv50Ly-7$ zR-ESIH{1%!tjAGN*EnBs{*sRG=*&NJ(KCJQ|HwLxes~g0>Wh@++rfTj=42MFC#s#8 z{;;PWYseg0o=stlmcjk+V=KDyef^2n40MeP!-MC8MgWR>MRw85g|_yi zReBT(t3$!7&PZR=DmP6#_3Isor=#n0E*vqRg0VXnvYC&leLt~jCOtrXBeGp?vfmJ+ zp!!1!?Hr=OKUhz7(y7!h{nnWVc>@N#c1!wy z@rdJA34F`+dSwLrXiF=~azZvS5$uNI+dHrJ0DH_9&@vZ_e2ssrXpS5{x}7vX6@~HD zk~GgD&*ry}77;~QacRHv6ZYZtz>uFL^Bvl)Ikm_)ZutJV$tXDmHM)%ch8*KC`Gjr@3iT_Xt;&fNW3AN1c&ePI3-elmEu`6 zfE7OsL`u$VMWlb|apbGGF z5EmcAQRKacXTYOEgXGZ6k)OkIu@iOq2B0(2&Y;0J7-_a4^|;U!oZ~S3y1HkB5hYI( z`z_h#NjkHq+>h!ba(y2X@ZiIArb*!yP+RHFz7UX>+oGtMeXh5vd(fGO1vy6_IW|8% zo&&Ih4qyPy*>d7%TNQ7o#6|u9*1;y$?nAm2DdB4MhWHNAVD`@)lO#1OdD0Fo7gR<7O~*@OXMZ{$=;`7o_=v!$g~Bk7c_Xswi~Jfhn3*K3GLil% zHi56yl!q%f;|cK}5wGrIFl8FhdBaEF>(BjnG_bP2k}c?2Ean) zUCh0-W|AXb*`-JrE61}E>+hL#yQ}LW(K&2L>(ua`x1h2P|MmUgAkkl2lS6WDa$~Br zMr*71eZkK-NEa23GxgXr%LLZ*a3|KHK<0y6w&3fQ>FD5fqe99Ic)vwPBi`|JM{$ny zgE|R1ylm0sst-3*P|TAW$~af8%`_fq(}TEubQ75NViMeX9w!M=8uhIdxjiEF_>iyBR#Sz|j zj<(Yn0Nt5ozSejE=zMbZIjjMNOQesUzjCn?&03ygpS1IKPT|pPJU_v8gt_<98-&tbg}hz2wqpQc$+y zQ7LGPUH@*}@R+);!x!3>7Q3#4_a08_x;j~(ADg+_^TCb+v~@(kUnz+_5Hzj&_Ui## z7l`?L<>6~Ko2NesTUR^ZH)YOjV}3T@dr!PeTs3BoETZ*V)l6=Z1UD(xS$*05Ah7(DUct{4$-->`w=e zaKi9FJfkN8`E?S9HsKxR^LL4{N)(^WJEB^sl?(Hb3somwmev(0Hkr`&#Tz4fYUmXx@$!MC zDx3R!{cX6Ln_<{4mbz>FwewHhKbM<7?bUaaxsM@%-MLTq!)~?RRUI5Fx9PIM%9eZT z_Y+~&s4M50gV9nKr*eJO{N;<@1#MErC`N~~?M0iVQU|xH?;oA^6{QYcRkCwj-E&VA zLy&-149ySQ5;Vq06&cgRC#BtA+FYA+%j!S33Wbb@rW~RvC0*POPsa& zdB2GCdHxCZUm2ur97km(CkRMf$hZGLD)L2Tq@p3GWC7sFP4h8m$^WmT(4|F5@V~S~ zT`HP{;Qw(Hn6xRuQ;2?1Vguu;QckPG7(Q~d z$%wi^wm9*zy1WP^rATAzg;yN8ppwG7Pxlw!0X+VF+v)Yi@gUmKeGeTMxos>RrJv_X z>4#?7j*A;9f3;bNMSUM)vK4N+^yI5HL#k;qN?dm||oTH;(nib^=$I5cN6_UTK9zSteln z*|rQe^)2<;u7Z@zrcUN7t&S$_jKWRkTR?BMy1=9HDq^9YBbB5UX*+~LVE7oykScOX z_b_}eo9CpBe}f7E>ENRs1=deH-Ama0E!h33>_ijrdGmZVWL}vup6^`t_VF5_b7YLu z%bl#C--)JjVF8y&c_Uts9U`#)qY48!5J{J+^`!8d&o5LfJf3oNa{?dX*k-1 z*a<57`xK%M&w2uXNgkryFg$1b9_m|Z!%%jVx{_@+P(U;eR8m3t@7u8b`w8+)Cvq8# z##BFa@bauA0a_70bpn~H1-o?9R6(V7x zF@^MZ69B-XVu2{BOf7H=$7T#vA3LqyR>X@Y)P~v5qq{LnPOvW`-bG1c>X`WIsSONS60#zaXIDX#44z-sEv7iCye3EY% z8E(OzQbM8^IJYo_;xf+4gR_j)Gmq=rO$;7UyO;^}B;nk-8HIF8M*cga(6W=_kn&`h z-J5OJKAjc+IW>XW?dQBb5^`6AVFu%$g)j(a}n-)NrbC?sMA$a2H(Sb6+T1*LMn zj>(Adj|)qUp})l$Zr)Ej8uI#u(muWBwg3b>DltVh0_UCUkyR{F3-XZXNZlUyo-4EP zSXyf!V~0u2EW!CX_;|z|FZ4+BtUq!*m0apn>JE6!Z|pNs#dtyD+UgN&#)IpKru-;p z@eXHkq?u>!g>+k0*V*#3$w}3Rhbgj0x())yILUa7MCpNM`9v?fN;lNdIc}!OAOOsi z)NSY?L!$8J{HWHg&}s3k5b7789H(b5K^vX-?%Giy5Zhj-`S6horcHh*xrF?TE&vBY>7 z*KbzF^*4PE4h5K{pPbpqP5bL^|D}((dq4N3BRx+XG|Ijp}96);X&~gZ&-Oc=o+b6_-%g_y2<~cDW2naXU z|F;_dKRk)@zcu9xC=$j%0e(5HO4c5{euU$?$p-dgP{$>DPxD)skh?X#JT)f!@H!cX zXo826X%Te`eT(P1*f?5@@>x%L2Yc;1NU=6m#{h{3QKN#r_!D*R)EWZXQ#RVV_x`W- zxa{WS)WK+a#W{TBl`?}L#-Zvsq@BGTo~o+;{}+s&1k@4ru8 zPVO#Vd?$d$^TxGx6Zp$~Q7D8z;sXhGW2onTZ8PofI|aAXcYJnrRvoat^<+84*M)l* z6MWfv8J*=C5^}s_pLR7+f!znl?c$;Mj73KWe@w3u##C?UdVkJ_ybqpV>{>hh>5P2W zM}_|MFK$K*$nSA@G+*NL1XXEmg$*cEJF1%Sw#k=R&ri6}2b!mkrt+o*bh?oE&$kh| z;19fM_O@ShnnH{2$>#1|*C1gi5!}o|I?^HHdp_N`Gw9==u(k`WQ7O-Ovlwet$)4;% zyBP)MM-$Rl7#IX@<)K!u9&wqGgu_wXYXNz;$PVv=WO<@cuIugz#7Ee zc!%Uc2k1`&z==R;Qj}YduD5&FIUYCR_0A8{->%ytnJ(+EsJj$qH%pIK+$89ejU!$t zkNcFn_ay#9^zdUO{DCI4&z7JDzT7TR8VioX3{O^QQs%%P#yvS)#?jf42VR2UUbF1U zZJ)S|A*DcpCw_T>%f6L9j;CK~pw^lSplnGuM2Q`Pz}!Pjg{xkOPSJ_`8o3Z`j6wAB z>7w0I;6I#5Jo#^(-|p5S`B9PVDEwtO>38i%E<~|i?-_Z%2fxKewV+=uaHh(Ofg(M+ zqniD7k6G^O2%UV?)myv+O(ZSpVfKiCAlQ_}yXt&qj&I>uc@_<_FcTbS@O&wI3A)wjofIf+fap)-M4^iW8I3fikF!^3$^BkswMx3q!C-o z!Dn2B=7#+L$DAMf9Z(X!cxM6>a?WqjK|}r zK>6YNA=c&nOmWXSrlk&Mm9pb%8Q9cG&MMHjTox5-vtd~%X|r}hISY&5#s)KpBflxr z*)9I_C%TC{mga*UCwgUj0-`HBr23;S|8LkX_BY$6Rd=TqszPGD-cSWUHQ7^)A|3QO zHc1hOQFFtkS5JCV{6yFA&4-{0=`8WT1p1=d{*Xw}I_Fr`}YV5%u-(R`1#Lh@;CnziGe?!H0SXI&_Fr@}uWV?^DUR}pE zCIa6)-!yVs-mX!OLVdYe?ck%MG4=TQTZdvR*5NCeuxPhEeE7hkuv(tk8||MqefXg= zm(tGxOMXN=L;-v)=$2Sm_H$uD)Ay%XRx1tVEw- zgDoD?5vAmbTjg-D35n`E-CU=RJ(Lsg@Z|mW7!+ExOabOG(i5Hm0po>136l+RkNNWYJI z?AbGw=%PQ8v!jJp0?DmuvGOD_rIS z7y=c>#H$DT_x;rbPxG7S0AQFd>~^1YUfbkKkg6bW;Ei@?heW} zp8mKHp5|z6w)oqD=&55+s8HH%E!@`8x=-Q*d3UQB1LI&R*vy(|>Vo^ZCd&4voBP>; z)_ePD^(x57tn+It@-)c!^G`=QdCu1c#NUR@rd|qpn&tkWr}*#!;FUPo!IlaBo;;s1 zJv=Bu-F;Ase6obx5byEoSOTdUH>19nSDxmN1pW5vlH{=j;?74we3CWJFt^I|?N_4l z>#&M^CxQZ(!#?#ToyhO6N6%^^1vC|iG@MCK@4 zS;rEFoE-)XNP&NxN`)#TNVdxvlpMa^SU9r^4DR3uIZ&C>xA66cWF~i;7bM?KnKd`8 z@M(1CK1BjVttzvk>+HQ@X&)FgGF(+DE=rn)54J;daT(P{>G1861_$4ME1>bG(A<;9 zwhSAQ)a>My|@BgsQbdmx8`rU1_F|28KupL52nU`$OZKnCI zq!2huTY?AEW8SqPTj8FB(D9wNnUXjd7y-%K?ZrBLCgyCv++)mhWiM!o?FARwrN3)X zu&!#H0h6e9m<7Eubp_8$T_#lJej?4Xvq4%P(w`Hvr0&i~&9<8?Zw(74Jfp?ui6h2o z^6tP`QBP$kHsMf{e;A{^w!h?zQU=8AANkjZFr9K|ot_EIh?iX@o^P8>4`0{Ch;Cz# zo$-wQ+ds3@+*(&099OqTY|-%;R<6gX$+XH7xB$4E>g4?Idj&u^rKGfa-c9 zI^SryA9m8Nov&0)!FV3w74Ix|o$Zx+ZFg}kzrdn*%<3ga9{2D$89scRmp zFM~#mc*vw1hY#Au*+1^^1lP5Hl|G|@SaVLmzghgA#~si&Z3?(Ql>GBq8*R>E&5{-C zOpSnm^T6!E93URig#3?AIM^AZ;a@T^vnc(FOq&l2U%BNjL4QxW>73=N(aj(W1P)Pv zf1-OZCJ0`zI6?xM`5yW{2bM53aY&+){J%t@KFE(JEm_dvPuM%Zaq~@4lVG1|3kvY3 z?(JcL2^7ZgGFyJL27JDZUE;GrRb-RcVuq>_XE zPeHyCdrNoa_ZpV&CjUMV3;P7JELu#FCH8l=D5S)yJ~TpSz+;zb!w%aG(242j!_Vlm z1z9dW=*|~t)p|Rx6QvV$q;iFLrGO7Iv;QgnpP69hkria|`)bied@;kr=O58Uu=G{J z%!>M4n%c2Sd0(CdT{OnjQ&OkF&lld`~SWh5ZEN1yj_AnPk6DkkR}c z?j&XGLF0HyiwW)UcldaS-+CF5ymoGM-<`Z#)&_)Ox zv_UqDr{C!gJIkzJTv4}Kq6du*qS?zKYg;G|Kkul;v!`L3J`rQ75~s`lUU;zC#V-cu z`NLVnQi}a&KRhjPSu&(+hbwLJKVSk8Sthvyd**a%_&3Uo6=M4?Ew2u{y9-6hXBB7P z9d08LW({ual#z6H*e?GEFNa3xqy#LyF*DL3``ewAS15ODf2J|xG~^0Rg-Zf)&K`!f z#a$-&AkpML%+(R~5}SE(CL1*3=aIQKL3Nnu?P-RreqgBbDVAV0^eeGnpiEr2@WWn# zMez=yKYLBOK-2xPZhR#pR^3}V#wK%3|8zgVF3Wi)JmEDgibyG1H_?oJc^v0)>oB#~uTOC5Xdbj= zOEFk}+JW9-NE;xR5&2kCcX$M0$b_Xc#+$c$A)N9`Iw+-!MrH<~PIN-r<$)>MX~~2B zn|_LL$}GD{J{;oTz+bJ!NRR% zWUGH&$%15%`H*@^>aTSE#-0ocRFOyj&nW(+TgX(+Bx0A)?PQXxw%l@{GE(q$_8!qZ zMgk+#Tkd&3f?N^77M!NcP_>#A!+5d70i;LmCm>7#3vZ{^qSkasHL?NY#RMb36* z{Zp0-rLk(l?#WA`+uE&RCA$HY*4-43mPzPAtx0A?A>UbK*MS6#5JC!h{`w|yGZwLg z>waTMf`aJkdio<2-%7(g;RHkci%KAn@mzq#@;2@Jk`jD0v!efndK+^BUsM9-e^dhX z|4<1n4emmls-hTai?==tux37{eVXek`T^#s>2HfFZ=`<`Ua#tA{F(diFf@WF2H4;! zKqVwpc$5>0i_s(b!WQx~1~iXYV>gPjQW^Cbhh%W^jvTyzWiz9(qhU$P?WrSPs*Gfc zN!4_MA`vq7P^uLSfND0e^*7WA_{!C`Z;VfBSc(0NOi=`+8Qh#2+YA|t4ZJ!0PaBfzb#sC)OnVc4td^<4L6kUSB>n+{uB-(Ar-`YH1H%+QJI z^0|;h)`^`~6)%c!-Feae;WYQ#KBVgOfX3CW2oj*!@))D_2Iu zZ*}BagunUI;&^xymtwXs{Ihm#zX`6&cHt!e+*cgx952ONSbjt}ESK=ps1U( z$5vM-;%H(|1lwE;I8{hoV9Bql)d}yTqDS|&KXKpCW85+D7^nTh^P%M|6RB$xMnv!9 z|EZ#GV#Uk9(z9^%OGqQ#3RFE-DIX^FtFq){aaRAZiOxj?=uJtP8rqB4WJ^#Tm{>?4+L~Ix>_LKSGmrrVd*()bWYkMyj)j#=XLt zs-Uk~_-Hh>0#Zgr7z)nCA3cU#RC1pZRL?Ae^8cu(x7EC;3$7pz_|ced$c|F{c!|Q* zIr@FFV)sQP6m63jy@pB8P4~P{8SKB0r2ma$^@ck5|JW&)9{wwU8nkdXrHdwYlKAC4~w|@m&w}- zHW68x?H~|b%@;7I{~iy!rKYLp-TTlw+l3hTwk2bEmb3B_(2$|uf!j;mH35|aq&Loj zSx0a_ve;Ouudh^3zbL{LJD#U8yM5mGmWc7CRoyk?yN$LgSHS3*_;j95s$qo_p_$l= zIzPZ~+i?`*=pGw7NCXY@G~Re&g!M6dKV_8~YR93iwQ-KQZxQT%kSu45(O8O`*oapT z5z*LQvra^F|FKj(aX!X}p$Ay!nvGuMBaOGfOdhJZ4o4(Auvycq(SvM{}7KSZ>uu%8NX za^`y?S5)=JL}W1Yo4-2020v&|BuU}>xfX-w2=yx7vOdz3UL)r*uLzp3#jxC03T}+2 zHwe1`XhYYUfzj}BqRv)`x^6$luN>+0BWc90?@u{iBk#c0LT5oSWq(?Y&tZBG6_dJD z$X?}p*Ub2tl71!aR+e_O$)BrqhXN}g8-KLFH_>(X*Ge8`-EsAT>f_WHCErlDDhf_- z`)0}gdBpOo&7VcR^QCSgwaJvY|Mv_cmQVs7- zS*?E~6XguDx5{o|#gzGJK?n8pMZM$%@hii&ndcd5}w=(zqL^9#RWo zZ1N^#b6669C<-3pS(iy^CKJSkb}L5%2&mpBkF}Q^X!JC_Pam9Uw@jM|o=#Dg-#7?n z9T9S;wh=51ZI(hri=)5}8i``91yf8Bo+s0VS+S;cRTQ)4nLnwB-KVlfFIth!5|KE6 zim71QK6Gima6JAJ5!gqgbfxC*c%!Jy;5gg7({%t%ff?5fNp<8aAne8K-SzLT5A7AF z+E$yk&~-~+*j% z0$okCq0fA2j((3)sR!qOI0DqDQE|0J%y2}>TRN$(x?hgj{sTF=<(n>Qt;xFkjTYupQ_|2K|T733v-AQ1F z&wryGX}$9D*g;arBB!3Zt-%wQ7+3>7)6h~q1gxwNt? zvp6=!?d9A)6p_u{iF`@OHY}PHLL@55kWRV2YV?VMcY(yX{bDs;s8_NA6`Tc7V&Zy9 z^-A~Rphm)m%X&%P&CBusgzHHSD*&c7pjCYQjNY1wRwY_RQY*wVR3$BYfo^A;EZYdZi%el+0 zjM(PLWL+8PIT(Khr+NGVX{W4Zd3J&@x3MrH=*Rq|$vPS(4$#lG$?;~bG@f&>V ztBB&Qb`bFt>aN;`CMYGnomW>c;FHtNST8d8! zZCSKq>-RIaP1v`NL8*}W4CkX^sZ~GEM?C$G)x&~c4ZIau=+8TFJlqyRE zGA?P^;!C0qHGCW!MNY*WX8R5#p?=$&yq;ahP~F34vih;E@%dfDJp<%yFl?jE$S|-( zg6uBw{m+H;{Q|1Mx=;v2Ln|FhInE6m#%<6a@hzz@r0)5`QA(8urb9jTe!VaRBXm7i za}`u2=+G^{RZz)KqpcWj2s3@KUji+P!&+564|ByVNY^bD4)3C3=?J$T2ui8)SyUVN zk4*T#s5-~!$bz1-50wU_(gU*xDx3V55#AbeDYqjn(qh6@$MY(ChCWo~ zV!9kgxt-pn48;6jWI}9T(g^r^dJ1&;_1yOjNxOJBE`XnboiZY2QP-(@R%&}}M^lf& z!|XjgK#<5seybxBUCA!O{1WWeOiTX0I-^TRl!^G!YwUc>7 z%Ph}yT+h}3|0efY?Wc+T1biS(*=~&@W`mX@mZzIz(7(t87D8jVa_KsEMs4iOF(q?h zepUQ_=Oh`WWt$+Qihq#_Qes|6t4Y#Zh?s!ybOhMsarh>Zhbp-F#1R9b7i_1^me+sj z2#)Q@C1d+N-{}bFZETvz!8-y!v)J~fU{?8f;L4|`%sZp@%(jMV(ysJ%K*PQtUxX@W z!8|oE^197OV>RS9v22fP%Dnv#m@^~ZXpaWe2$vx57tvK!P<|&K=x7*55ns0tBLdbP zT>6kUjBHW}w1@8Xp~G$3<0bjdf^*&i)?5iiD+xt-LZ zsyU9;o_Q@0^;;_7H*g~yqg@tW7@`k;e~jV zrY=nUUphix^ZDs6XbJL8zahJ&i(E|=H>o4;UTk&JgIsB;_x|I2iZu9n612F$wiD@q z-ok>!X@+HR?d!}c;JQvv+zZ|!a_jPcuOKT=1^WoYy)PvWIRN1+@&$$}uwlv8~?cxJQ&r=?pw|Wo)&8#Gr z@DtaA9R06EKvTAM@Y)ho3JvYY!LmNb`52_lOI1&2Id3NHgj!uy9jIdRt1nuCye5I~ z1DlQyxYDsykdb9`++g@?3bT&&wn@Y>lkB4F=w zraHDmK_8|mN=)&&mjJuCcB({#Q;{`GXu4u3FJ5q-JC#lZ7}d8AjJ5a!_HTVzWf5d) zJkFTT+SV?f!VjAkn_@n?YG9nwTAF2$G~PSd4i(ob#t=mJS-Nr8@I>nt_;;=hp3U=h zNZ4grK)@26n0LdrjjHZlfx@WajVWAlm1y86bDEcf7Q^4pNyC+5@!hGc+Bh zD??fI^=MEj6@d;D9&2#dRUxav3Yp1_BG5y5^f+kdHn7 zmWW~7B99C5%n7t^fnIZr?BDUQhwEr5;Q8u}e_J9H9Ev;;v*kJ9s3{j!G(XnC66|#wwm}KxXjL_8nv-NZQHZ zvb1oY)WzeC!svG83<1CV3F1|HRZYCtut_4_lOe(E_JF>7m&7|N9EhHq4oNpY<3uN} z08}Lm3+`s~IXW1NW}aycHJuAG4Uzh}$L~rpJnXaaP@}D_S6_rZZ+jhF4|0wLPyu?Y zM-^u)f+e@$81C>vv9pGw2{>Y>728ubeJ97LnQKw=XsSKS-?;4Xm?sxqTF9Pir=__M?K*YS8MP#-#bE1}+zf7N!u5kDU5iMzfx0j8{Y zGNJGtwR|C$nw2r=W|=l;uVF>zZ%hH_ub@cv8&J54ZgoPx^Xa zYe)8}8aaG7cgOC{c3~>8EvNK*<6;L6&~}yOBqQ>d z0$DBy<^i*Kj13tRVy-q%9TyB1&rg>_Bq;}F7Bq?>cK%B7#scIurO&?Ty+fCSH8}?b zR;c9h#i&m`<*-yGQvsz1`_=O3UVVoTSK#D#qu(34+77qO2>?ZSOHYewoCd4iDMA) zr!O^x<8rJLX&@h+$~q^yDu0nH_HIJ{a}B`3p?-&Y2O{GaC*Rc=ZJHDaTi7%^P)AAn zlXwA!?;LZdR(SA_whRD#} z1t|l#XrPldTRPT)nN{%)kA5ZFZVT^4Tz-%Xx>Zj9XUhzFZv0ppXKaCLk> z9`w$!_xe83i^@lL_{BNcNj;OWIvt)sy5O38SGC7#9G!t_Se2gcSIRr&@Eorn4IqE+ zf!q-UR+2y-xgoc^05mO6ucdUT-wT?mZr%102fkgG$;C{vrn#1w1N^XOD{###3~$5K`<57Xa}exW~_|neZ!rKFgPvDo(?cG0D=(flUhmtHDYoesF((^ zA$U?9)7*y12W{-b?!dFuOotHr)`tX6(VEtx8W6ZX)*Y3>4*Rc%)doM)qt{wpzq2ve zjWTR#=QgkMPF1YO0K^Z_1xS*t)^tNME5)GARoU`#JTx5vjZ=2_(#w{=JQpU4O6btE zRX)B@$&a+()MH7FHt)vZy^I<%jTWV%sGPwRHuoSpY<|qw4MoQKCOX~&QFI9 z+G{H%QO`<@ezH{+=h3FH6!TF5UAgECJjD<|+_$?^#5sSMt{e+w-N`g`W-yE~*%&sU zBk;nTHc$x@wY1HQMQ(kzyUReDJ7B3$bf~qi*NBw( zni#=Bk`=W(t_T|HusmADrAlmz1uV3PT}$Skh3X&g>bSFD3l<(4$g^*yKq zYFi&NbbJ*`U*~aJzwx?djws+S1!eHxy2n$^0e;+z_GqQ&sD}U#l%tbhF9eUv_M!bL zRHg-!~8DI`Yy%n2@d z6#|vuQRW5e|1owP_p`7xb-r=Yu)Ti`{d6NO@nlhd@6L>%4j;vQ6LvTf^b~)B{?;*L z3)T2eX$O>K=15TeN>nM9^JXy>qz@YdRNC=ml4Ts#GE{iO{9CF-W<;%!%#FB)UwhMO z7Tv|tR8KK!oRUqi6g0fRfVXX*Kx5wNOXC*$PQiJ$Uo)Ldcpjq^y=>Uw-$Sv&W=nFj zcW4#V+NIDG=UfJ{rds){rGltoJ;2`@rWX`h0Lj(aDknfGttn#W1gyf9OLNHUyN!x`Wh;w8)JQPtIR=>5gBu(u2 zH$W$rgVc1O+X>D3JjJUD$WKEW@CU!J_XKyw77$%t8hC{ios<2HJWv637(6nUd}0l+ z(la!=9=E0Fjh$fO?3>$eX@7g_lA!9=HOn zH!h4M%@_>AzJN)CP}Pfm5Gln39eG~LWPJgqE)Df1JhD+ye{sB@RhGzwm6WrA2O$$w zX8U;~WGth|ZeEUV3J8GO0NtJ#h~cf#q|)k|q|@0Q^<0bw`x%MzZ4JC)&VCN0{7eW0 z1Y%eQXpAh0V$RHG#9}o`3WJ0T(YPc3dTIJ}(Ot_BG39$YNO%EFZOUUWcU)>iUR)II z1UsswO?gVEif`}3kb`mtOJ93ea42gDa!)&yVuJ>ng*H}Ip8|jxsYXE&K?q@+)2VZ} z+jiODFE|pI8xnMUegrx1ZrI;tU|t}$GcSUACx}ek4$@;2pbUoyl=df8v zOYEnEP5D&|QaXS!F@8rqD|@5yiHqBTgh9rzGz(hamMl9*q%&d?g?CDIY(0gHjo^Z@ zLUUCe<)bgFj5_<}(tu=CZmIPL^_t+SVpNWLuRBxgGcKkDLQ_=*W#bpCg860C(oIO* zC`+O=GY%_ifVNza3ydV`Fh9=5qkA8M(vdeDNeGLcdmrF^&2v2clTHLMIyeEoB%#D? z-Iem*qYBUpPE%a0V2g54^FJJa>#!R*YJt$g2Bt~G9oFr6+%#}#2ooCC1iU|Q*g&j( z@_KRxM!^baWBC1%qzaKotoI27$!El6)L}l9OsL__0|CORk$NGvy}Lijx>+;!<58A- zY|cI}!2*1j&D-BSrhO-OxT#7fQ7LBJw|R=^tUuF%uw6}SGJF>6h>B&uP&jgpG*kU- z8PE94?~SMy=?`9f9qA5;QYHb~Vwep3ks!>5X1ZN-FLj-^kk=&!bWA$1J>f}0=)#7R zQ5y4`Bch!xuakERSWDxmy;RaNK~Hh%UKhYbngXCH%`7=A6?Tlh?#oy?wb*f2hlSfhubOB%OKVDA{a4AFe8puqCty1dI&p-G1iPS|f1Ojks+?BEL)vV3Q}adn<#O&+ znOY;GIln<_>XN#>ZESxCK08*dlxN_+3so@h6JWQYyf;U`$U}#DOeh|5Bevo#f z@^T1S9fKxC;0gTvk6?PP@g%}Vr*h$dPjF(x$!YsRMbMKbc92x7x+DGFB4~?0PvNf; z>s33Wvc$Vhip;{X4<>NJ@m97hSozKM3qU=+MEL-y+B+pyonW%0Zq!u<_^;rmyD^XS z<`16>%H6{}^OQ7Y5?SjN_^hs6sGnSjHuSKL6I7Ifj0L&j2ld3Da_fkhW8e)`oXWUR z&`(WU+#f|>Q2$EGr+pGMuc&_f=s^1a$tJUJh4TNt;x^RLlD@Ge_@rygZ(A%kDl#3& zH_g=aU3K1t^uSptAeH*2){^nLV5{p%hdGvVwQ*Op{O+gOe|H=1FTY@)s7s zaF?~CY4&QR$`VA3+;rD^ni~D2SzPuwUq0*Cc2A6Ksk!kp3HRMAiG7aGEgDf^8F_{b z@#If~qiWzK@M`Drs(V?1X%b*YOy81EmzPRU~XueOEn@QWgF(uO0ydk~z<6)DHoN^dkfhmW{ z?9st*b7w4NlBKep>yd$(^Xq$)*zw!etID;01!`43Bn-(I|IsB$Q!v11vkx4o#ztj! zhT^562`)jM7C>FPk&s|36yi`pF96{|i4X?5SU1!ShV6)sI@UBQ#K?eyU=#VmNyKQ9 z3z*2sv=p>nef?`RrggQk&$(F5 z2v~Hu07XGGqUQ>dP7ENS)XIfljR1^=4}pr5&4*#0qPIxilh2#XZWKc_ORAh`>q{mK#k4-hk-{Li`FH{0(iE$KnsU>E#UjieHz#HVcAIUO3>_fm*7#=VH-B-ywwBvr8{f6%> zYO>~K%}<~ojR3w#jwW^lOGm~w$hag0ZxImFqLX?g<#PR=@cCRAjhdtW=ql%bI^|iQ zuMtQHVaORKH!JX*jz={yy~fJtJFQ|5CYt7_%lY+NGBY}e_=_`?oAWD`Sx4iSdivi8 zq1aCU(zT8ZKpG%FL$xs{)IvrGW&rI=B2gI}40nB|m#hO{h=_FIa zBtHwHbkE~Bnjy3d2T!<}3^tB%s;H3uLmcN|a9}kd6l%{@YPU^gVtnMuAqmnd@HU{| zVPxjz2Ci&Z8T>g-IdvE#En;VtuDqE+0saU9F_R&TYY8w;9^svggBb#ZP_^%67_i>uO>qOLo?JGV%* zV%?-o&&cu|sa-jkF=gkT3fy?Vd!QVXnw;V;$OExT)|{mF8mWysnz?fOnA`d{uPNHX z$t-~U_`wJL|D!VhGp{9?^daIVQR$Gt{tq$ZyeAabE)_TF zr*8^|Ye@JSn(f2E%&h29ROIgt4i49w)AFusT*u#%AH1E~R79MQ1S~!zKEFrzX8<<~ zXs;KJjm?QSd3(A~F>wWV5MCd*CWl2wxE^~BnQVYtZK0j>8S4#UE963YiJg}PW#yuy zT>{5h$`=<}={Z9?PW0}k!xhJ^2vongEaAPGxG>qPdp$-@%&w~shkHkBPLU*#A;}L? z2{30_4+farHUru)9Gd8l1p;&p4#1|wW8B)x4oIV0Fe8WPEBWnv2~7u@RA?O?J0{l& zPK3L#v`^zh3%cTjptU*V`f!|;gF3V#&+*%g4)YeB8v2@@7W|vFsRLmj+{(<%vb*Qa z-ofvw&*zUg=b(tS4bkIb7Hmrdb|ZMTwPOScO>4$Yv-@9pGgXz;A5q}V_yF+F-jopo zo0F%co$^fo*3HaDzTUc0p{sYikY0{0b?bJ*&8ZK8?k{#6VamN@w39-Dh<*()@fsVe z{9(kH{1osjlHL~BKVIY+{cuXpYrVg8!35$5fYk#k((gHNR$(t4CB8=88?W!EATt>X z1%vCRCiO73f7rrAVol90Ndl4s;c*bemwo~7K%lXUp-uzMvbbgLBcTcRc+Ok>Ubaq+ zB(y!69rLymrp%Z4upz$mp6bqOmZ6{v%d=Qj79zNbcu9dw8y)!W7Rra67?p0_180Z2{o^tyYc0z$VQU z2DR~(aFUh&zk5j{NzgjQBYJEK=|#8IrSK3_cIW?m95TqdX3VGKX++;CWMsE3OYhJ{ zP$17RO-j;)db-HZ9(y}eql#Sgq_J4T4a|!k(k@FKb<$b=j?pDb+u{;J@2;V{~f|MBaHJl4cDjrkn@DrnjRt3usu=P{u5#I=C^ojc6L-G&_ zDeUrAkHj*D7VI$d@}Ba3pHyY=@bLE0Mp`IY%I?3@2O3SaEf3yAX0?i}TEdN}xePc( zc3@X#atO`Zcib(iZKlXT*^C@1J|cGE_}0_4wX*AOd0 z&VkVEO&?!nIXMhu9%f{G7%<+JFuYz8>I8B_se+PRqNtY;eTJsI`b1~=i8VJ#mShvP zh~eE-7tDxBYgNOt|OqHr&WQE0E#5&u-6+KIONP@UdcqBtfL_kWC4YC&;b+F>;C2k zoLc8B)Rgb$Oeb_+t0HXQaj-MO=3Ah7x=WMSw=~scU6mqSzuyR3iu6h!dtqz?au5BZ zk3LfN->3T62Ow`cM+rj|xcBXmY@E5@zmZyJ^2{CiQcJ8z3#a%ZaO7J#72ez5^#~$! zU|>f{J(c#f0I7`5fo|UtAybP_s(_1p}&G%C?>yC z#>G3uV^JFEZ(Pf$m_FxJd94u!Gtw=x%A>6n+gNkuhS;I`NWHi)vQId{*pK&u_3wBDt zC%{)ArQOs<;!eX4hvTmqZb-DJizF@YrPX(YrLj~$o$3Cdb>5-zcwe25#6)IVM%AK3 z-q*(xE(`{o>xm8|T^>N9P^=9vv`@s}mou=+32s%`PVwJ$<6=-cD4Hh zvPN;wRmiC8_0e%NJ(=50i%93^zwRYovLY98WTcz0WnTK>m)^d-iZ#88BPeo-oa5n5 zMm#Roal>r)U|HF7Ct}YBu%2v1xKK&99tY3YTz|7D?g_D3NNyNuKe*)*Zpxn{wzMAa z3EaCqX(%~r*0qb5T7Qqe=@!5Rl|GNeKzHMi5@jzXn%vdZ^;~*v2ekO#=zaG+%aYiW zBE*cz5O*XYXPpsUlZnchzJw^@Hn3X>EaR5_B^p@fZQs^U`MXKjsQ-avd(eYr{|aPas#@BQwygbXiS%;Whwxeq(50&VOY& zk4+==0EhDBsE*{=(2u@SfVcT~|8v9Y(hP3cv)3SY{D$~?0FwX(D~SeM7^Z#9XgpBgCi^!fgPrAE*OBGc^b@P-04o}z5TqH zu(4?R%O?F#uLY};>H4-uEws>~#z&y77p8H@3B z!9nb8S4*}&_pU4Ju4*m?PZDXlADmjv4zX1P0l_;NDw?Qj9x6eI9YqehmwbRkTi=7; z^6>^Qq5zvxryW3#`(p@w`w;zocb)w@V^$e#+39!I?^!R|jGi5nIv!5<`2&0_!>k`j zHT>e!delh-Hns4Lq_AWu#$+O!&bl8;M1hV9HNe<`8wez(B~#Rc+hx}m-Ctn}7XFc9 zu3IPGax9_x;h19kSqvDhawk7A$N020vxED&?H&DTKS}|-{{>SLrn43dwoN{+nOlL_ zH+b3cp`Gw^e#0Rn%|?2|t1y#jsY16VocSI^44mz~5S9SY&vc^Qcq zaCxd#S!^7Il=Nd`C0f_WJ>>N{c6)v0K&}C3^iJd~qnxMV$1bTk1XQJQC8_(Uzu^(I~~D=yoZB zoOCuID-)aP9rSo+(a^aGuCucKq;yWgJf-|#h%Q0y6TKt6b7!x*NZ@1WXp8SHn#uy4 z=OBM(MxI9~O_|&jy+Q_sxyysF+xY&;tw6>Mk(`R1MS*LJPz*4edhA?<8#CVEJ0ffq z;;R)GINHB(6$Y^;aUd;>q#!v}nP#&=jkPHl8-Jz zsfWZ@RON>^iI3bsm)_VH=O(zp9DD(&M+OpgQo~*za#L0#PR8x zyT=bH^>vXgH%oj~$DgmL*)d7Bd2DEW46V*qH z+}cRlxD3L2ORjdHA@!s|__8yPgcKfK%739qxW>F9Y!=rY>I%@U*cz{_>t7(R$98Pd7wK&P zNL>BVYEv^Nrnlcviz`-sS(NsG#(n*~ZGVY)Y)4tzx2KjC22lx-Hwej$_`P%P^@OqH z1?jGti%~6INQ$yjBr0w4ji}fh6Yye$xs3OU@>TgNrrsB2q4fypZ0BYQdn^QNvtjw9 zDCQ7>+)qo$SlsevBC6+ZtU}cP(z@~nJT9xwgfM?u-_6fb2;BUIHu97M!_ritT~exC zI!ZrtbZ=THi)+AXuww~7evKXQcDHviTR;wxVoM?%c(JE|M{%i2riekUKL<#UkO^WhyOtSbv zrHQ}4gn|6QXuP4_wCnJk`VFc8ycx_bK%^?fs%Z8rkTkDQ$_XFRl-hr7*|?l>k^h)c zDgZ4{3(mq_5r5mN-_?5#Jkz7?d~p<)9I4OS|Er%bhk?G6|E!C{Bb|X23&PaI?R_%u zhP7rA49gSs#Ei^dL61rHGVqn_Vz159A$ z27h?irjL7R&TFheNF->q0Uh&Zu_y4t`$7BTcL|u1n%!vkupLL`iUbTfRoN!M4ZgGnXCJ;x=2``{v^llW89=|X z^N2?(BW7g;so_hDXy~9~NJKU7Xf9+BPEQW1A9Vp#vk(h{?_5xxXl|tUf_Z1_J63X7 ze}2H$?M=|EanRnu0T@sdmBR@=!HqgWB| ztB>YrH{voWM+Cm{ah;`k{`d;sT`4kKBuB|J7Ir5U>PxJRsMSdq!lXTOiGr5lnQAYV zX)R-+HgSBY09fPUoXgmfm3gLY^;QRbJ>O+9|C|KzV3z$6Vz}LGC&m0kz$}5$ypgUd z;}PE3l|41lre+(k9#riW%J@a}+3FONbRrA1!)Ri_JrEs+1Ys+qFjx~CreS^vMR3lee0Y7?tW7b|0btO8@QL28MpXdv8D2P*%se)` zIt6*3iL$vGDzxd;#b^p%K#wrK6c&et84h)n^;Bv^CuW8!L}$OYPn-jQV%#hiyhU=B z{c^Jo2Mhu!87l?r;B=G;TQ3{RxLjMM@5iG9wi>d#GR#8)Iz6>dJWV=x)_{g#RUuX) zOP6yl0ni;AptuMJL$_~;tbZ^eSkg&dhx7DDJ<+!qXrITXzwC*_o`LTQaJElhM|OIU z#1xuUvHSG5t5z+j>7cdU{_!jGOgavdp|v7^2J4`*3AAv`Is|(wLX`K4N`C+7i{2zj zNXg0P0H#nLZH>GPL$Xwv;6FIc<0Oe=S+dattnXg2a-2Gp%9hL(fNINOoO z*ESt$wnx^=fJ67{n3!N$i6jr1?BsWfgSy4D(94b*z>?3jep^0WSu9Z_KuH+G0y)5f z-Lb|@sZGm+JpQzl-!^r9k}Pu5Wsc`(Ee(@TaF6h?cglreLrAzHft5{oQMM=kMXhfI z5Vk{zK;cx&`kWOfE9v~4-U5)47(mZC1?AaMvErK z1k2Yeucgj|O8Sw50;JC}?*h?+VU;7D+BO*YW~fqWod~FF(C@&lo!&&9s9oP|`FQ;! zU>_R(mwX0<<4>kxH~aK@0Wfcg8j2_>zy;a}^tm+(G~@8}N4v8Tl4Eg1Rq>xPKZCMl zl}W57*yOz4;-yZ(a9CKB_K&0Sq3$-B)69Fa!FmM@O)vsSBa>kuS#cDEJe7s^F8F>b zoRJ)7^Og*M^WM^|yN-AH2lsm*Y=x~+WThwPm>!jG$FO%P51u*hPY6_@4ZZsd0CJ0N zPqwV~Z1yPEE^FXLc2W@Kvz;o!Tz-9NsOj=a_IgqP`y%Y4>o73SRv$d0VLLClyHU5V z2#awDWjTYX6qsbYw8U<7h?Wono2`|sh>*%uVrCwWrmblG_`uF@n$32hGHj7a$Z707 z6rmTy;o^fJ8@S56j!P73^N9mWfP?+eayFu&KSA!OvORZ$KQ?7%1UhzJxYcVQ(KX|XcVmsk$Sd;yV zABdWSKq_5`%p-V-rs3Q<8iIc;e;Se_%jPnn&06URqx3g|EaBE(uf~I`1C+fKm zOeNX2CYP>bQCq+Q-+YSB(hh9cXPX(f;rgQ2m%D^WU~k*u=X={orH;ygU(n=kfs_YL z0+8glcYl`u2X489SS$uql`O%Q>FFlKD0)8IJTONNSKjUP3EN`0AhB7Fni=&H5QSW(Y;nA7UF=`& zF*Y1$8H-`$up1X<`S3f8+K&7HlnlulcP{wU8O6(%f3f< z@U|$Uy<%YZn$KQtAu3e#MLks3@~p}CWZP+-M|B` z9Kchl8$d1;5!Tlo{SPJ&G%xc|YAMu!K^o;1mvQQ-ql36u&3qbdA82$ks+z*tt(c}>b*n08tPT2XF&jH!nxU(^T|e*zg~mO-}Iz#5Z&{ zL=;rn*{_}VJ6(#QYBi5YVQ(}c3A=ej^{&ssO|4t4Gmg>_7R^BEa*(7(^HwF(;ZW znoSoH$|0MhI9!f6B&#JBie4;syW&D8Oo`1@0P8rbK%HoW=|iSJ&u7(B11Odl=v7l^ z9Bc7@?Bo`vv}hPOZo!T0eeOy~$`g61;6e_tlpiN(714w7wv3N2fHh~=>j|bh-1Qmf zz4{t{$jgj8Sr?_)|IBcjjT_iDt{yy>eC4Un3vBJ5L z$kUWj+7;BwVg`P|X6AisaYDWd*QvT?!9WSEPFTXo`+)RCbGt2b59qh4?a-&a5|Tr? zl_{t><{Fq$UYr^V?7X#FWBcfS4Q&>#>)ugaFQ)V^9}qfPV|r|nRh?D|o3W=xrXS~` z!ZPB^z9MpIyu9sh#|QYy++MCD?GkoS?miCIQvw1^@a_+vu=&{ozck!XNSKfv&{ z7^ISor!q7W(@J@A38)6`>r|IHkiTCh9GxfNwC(pzQDYoKdv_gdAo*TvK9ZR+uEGIS zwHH$DkEV^hlulOrFe7Zeinh**&%&UxDjzi8ah@zDn;IH(68ti(jj;VkG!Y$Mp>Ri2Z5fR)0<>(LAO~&;;|i$6jzz|j z^#InhCaRH!qV=l1g;K5@i+HG+4I{R$Zd1t$&dWr`J|^N33l9dw}mcv#e^wE z$OQe$R_{yu0YT0HZ(GX-XVletHhfAQ(;|ERop_b3d#My~2;~Qf8~!@oD5_A+C>3}G zs8*MhBcEEtTQ5>r35|M=C=X@aTrs(yl6~M1zS?2ywdj~ZT)$@c@c8T~C({iAmZWf- ztmcS<9Cee5n%M>@jEQKS=8F+vwbokohz9*eT=-td01A9+C`o1vrB2UCNVKh;_k?oX zf8m~Ez-R5L6Sw?b52lKd4c$9x(b0lXeuW=I_skoyvvHOzEAx;k0%e^32cbdEGXP%f z3D&$34|FxM;fM$Rr2xb6FiFj8a$%y1KB6c7`DXxl2q?)Ab&TL>!fAyw)bX)NS+0OC z7xDza+-C{u&7+4;#p9Vni3fY5qe$ElPt)&j4y+uzX`MwmI1MS|)!!?l#M`X}uZC4N zxcNP+9ycXus1u@Y-^?Y|O^yA)cQX*9pLyBD6a`yV`k8|U!Cm%XPK2{vjN`H&3>x)b z)ZHDq`p7zPp4{Cy0%BwwCW|C{0u2%6Y`v7 z5(rUCYY8hCNm1&c1x}*C&Eejltc_!%F>6^RAYTDhM)UXOU-jp4NqLW_1!_`rMW1uE z(prVxWplTIbX-+j_2*e6ahe^`P1cE`o!$3IhEW&QG^hgCS$>`keyG?r)4u(kQh>zx z!pplFm!jD)1o9=|Q64k!Di*z+2gd!iF^%Zh4U-n6TCF*04loMT{>nMmtA2)*)O}V2 z)Yx+e%5lky?KvSz4>e)qp1z+HD7x6yE-3#f$p`k2f9 z{53qICLM2DZn<5qNJMp26{3tz6$1qLa|M$zZndKsbqERS`Er>S?Gf-h)@qdQWKL!& zI!u;LixePCf5)UF$_{`eFcr*~K|(sb-lh|8_`ZrM0q3$iI32mK)%^e;e3&ta-xIb) zy?wn72*phdND~?^z)M`r8^wzwZ)O9_5dU)Nao8B z|0KYOR}hN_m^brZo>V$1wJglwxCLaws(}akn=7c6v$U#V)Oe; zzux}Eu;IdWajNH6*|dBeVpk}V0mX-x_WIXd87nw3CSt$I1y)xm6b|5TA)@_VYT0Sd z%S$mB)`F~-33%5c1?(D60}YFrp)nk4yuJU5_5}BkBL5NDuZHx7KrDr$rEcg!+d^^4 zkJ8&eabE@R>F*6kCZxhME6v~znEcb`nB|Ti)JGba=Ew{sipbUk)pu~X$3ua7k;T^1 zH$p4*yCBn?H5Rb-Q67M;^b3L?{`H|wq=)OykI2%V_bB_^X$hsYKY#y3NXQtw8TvWGwpL7Ti~59Gi{rZ0E13IL9}$(!yv0p~tG@HBtkR=WQ<^609`i_^%`f z&~iLehmz4#G3+TnL!dCNoM@EuHfuSs6N_1Jab%8^&z__=<3%TGjVXNdce6HoXXJX_ zIm3-MM~znbT;d-Di-6wVUFxo)YKN=gbn=nJ6{++ zFQNhPGS1;YM1Uyz8|MiTs@DUXaD@9dRBh>KabZVI4N=q%d-Sp9(9`eCWb?ZU63gBk z)$pJ`|4fVVKuj??$kyuPW)$t`sd~RQd18#uhbwe!ob#75^&s5?`Bht3_o}TOeIPY#Id{nk9SF+w2gxBn{_$1r z^Pob=8$e*2lybNR-kO>lKR7H@npL3+lAIs63DI zX2@T~qK>SeD;9?&ckqr#(W#^O{qgyZ4gIJ7jeLE3 zW-@&zoc5plUH-q;5pNZKbXFoomLjQLq5RcIA;6HeqvdA3@l1k zTMol-q)KMsZwpQ8yGrzIWc(1nx<$WXMv^D)Fpm$Lo$}x195!-o5x|-$! zJb6q|x0?i9Hba=XoaO9Ll&VPh_icfP1h6~|M!yR3Ew)Zn4y=x^BwbPAB$sOp&r>Id z2tVFR-gW#XR=y7#5(8a7t_J<49Oh$}oOB|J#+yAlZ=fEk04)fP3x=?MBHMnNoM%uo zwn`?)WVA!_C^b!MRpdRNtjc>@<06{yQ=xf`Q+$WNvAU|kF9yAi7BO2X{R}z06hO{@ z=d}t%8?O2TOs3h#7mfCUFF%wjR6AWo=bnrz6pKoke1jGfZQ3oM+00s)R`cUK;zqls z8Y*xc`sZUNmN#{c)M<(l{7|v;2ATQQQ_>M}C3%d&FKGoJc%=M-aWUsVLXZ-!AV~|O zf6O8iOS*=g_GQXQig5yadpWXW%K@B|spWE@E@9Mby3~}&erh+)v5Q1hi=r0>9qjdH zo;T#J8*akgHo>gtWL>6ptryqisCd2OqSCgd8iTD`Jrye0FmZ;f>9AI^ z*Q-4>c(AK=+UfmI3gRFFJu0o_)lIA>!>Qx7#iR!1!^Vcux0hE3cH?9Xb%_pixUWW>5WoS|`&9#x|^R~43~mqRZOc)ZLnNf&+}l?9m$G<$j9WlMH}QXdq!vC!wElvI;@q+0mSg)RY1sl%|d*v|XZ zum@T~HP+p~-~G3jBwzH3%MNBT*L^Y-*HEedNpnUoi@wrM+G+sjDgfWrlz$QJ)-fKO zazAVt&3HeJp~s6u`6O2bIj$>0%N~_^&`oIvGt4LjR$L{O#lHz~`#0mI=ch}vYhs5; z{>^D~{AF+Xw()z%)|GUB4^Ga@h$|MJij+IZcnjXhw$0Up5oD72Sw-BF+^BE{+=5Zc zDgumZaTs`#z$%b#xGElWyg)rB$ohEAaRH9jU@6I8`d}nd9OyjDkDph&K)4weAs)D< z1U>8gMCL^jqsgEEsBbsg9GYpYJ*grEkR+uHU(Z@SL5iSj+j^ui{fp|wxKq8H()|18 z(0Sg;K4UNKi}`J2r(NQ*@lH1||##74G$Y-zL zrfut1RiYdqd=CgSPIyT9Y~D^PCt@i8Eee^nj8r^o2Q>x2ju%my!@}rM%P#i8_``I! zk1$jw-}QBRy?QbZFVW_v%gHKgpxG8Yz0bG~vjRJwxYJo@&-5_o7Eo%qrtBXVE?9&2 z)cn=tH>2KSNO84{S$b;H+rEnTYc_~$s$ZOxB)O=U`M!wUiT`C1nG$TSTbDu2{ElzZ z0bV6XUi%eb7sM;aBKrpVcWF^$w@BrybO{OPCNr1PyIcOjmf-(Tb&g?{^lZCs+qP{^ z+qP|M+SaV;p0;hzn< zhWNc6pw$eECEsaQ$k1~sM%;w1McDmHxWPYIY;p;GKW{0U;-hP%Zo`Qw$_=VqRvw6| zmvYx#8bsiJ;Q%W})sgw6Nx;+zdz+<9U?LKGtx@~hEQ;>X?mzT?Y?fL!vy#e_ex@8ble<<1Jw!5rlbZ!X<{XVSWqy=qz$Owjd_!{CrV zJT=HwCFkYQK-I>f&pu_mAYTfuPR9pK*Dxo-C600%v9JF%i2FCw3234Ao;^8$L>gWC znK=y*>`*9Oi|2FqaA%>A9U&o%@XN1w6R=bsf?4D+pN_>!J6F|$KoXM})V(oal80J+ z)PIMv+jKf9n9@v1Q4}0%B!=kL+@PZJ8$G_dNKvP7Nb)@#h0OtP>DfS*;%?)zcC~UY zsxr)K?=oeVgxvUv7v>_RB{c%(I5yjtd&vTj?W_0l(;}#Vn|l@7++v_k1uR%T$bawe ztNa18JU;>NB6VcEi0_Mn%qK;B{2HfIdUO@~k3ksGuVO_rt=g-J?`=pFie?iGmYYJf zbV29_o8~cWv?!fiS{>)0RH~FEK{gA$!@giW($PHlT~vCu*S3KlHNB%eyTw$GRHr5Y zr7I75u%}^mICg#l$^$|rv;p_<-#?&}mlpfL^;BohQK6f^zv6a=?hpq`QZXt3Mm_`fSYjcvK_D*M% z<^lc~*9No5o?C`COCUd>g#_1cE_1OsU7xN?+~gZBcZ+i@OxL)Ymj+1$RePN>QX(_O z5U;&&3Fjy4umq3g&A#Rfmu~_POb=6vWv<#}zIbA*NE*uPeVi^LI5JMj+Lm{~Kpm;n z5$^Drb#K}m_)yvzZMgUnmo1;2%%bWQtOYg~YvsfVlh_4z1wXP#s6}dSVU3_nI!)SB zj{_IO610DtSoQSxwaB3;Zs*gHF+|uuRGFNtlLb5oW(@TzI2OrOQ=I@5!yGHK5-WS! z_d6`qJX^FRgFA%`F9cCEL%<^DUl9$I6UA32hP?j%K%})4BQy5{WpL@G!|$Y~>Y^r# zV@m-``5A|HxKgM#8R%9PEv*g9Nrktv2q}-iV4j z7q;XN4%;2?vFmBJ-^UC%5x{Vs3#(DbpD{4GT6D9*5BQi?w^VlkID>E<@oY5(O1Bf= zLvwL@yE=U;bN-3PWZcZu(+zQ@?t1Cgo-z8i7+%02X{meSK)S$0GgzaM={o6nN`}f6 zVCF%4fC<|ZY$PdYk{ot4Co0C!-d5rZuf(6eA`xytZJP|!6;J^%l;aQh*qA(eoNkG< zPozc1TO`lzy{i|ENM{Vr=oyLn`RVVOU}oDzJT`Wu8{I#wEe~b3;B{+e^ZGvGb)66L zgDYslwW4bUq6;W!f%}l(BqQ4nY5%p^w4oK2cJ24k>pvEkUS!epwDfD6$7o8{<}tdd zD0zNYuGh_RBk=;XzK*3HRfCHAAwf^2p|bp>lz6G(mhha=7jaUh8JT)Tt32A=@Xm){ z8!_QGJz$<{#;JRhi_|#z>ZofcNbEiwbsC zpO4j3%M20y$k@)qlr*}@ODUF&Q9ObQ<5dl7C>>@Lao#I#0-%m*fI55NR4G~N91;;d zp_iCpgz#&1DxeehDR?7$>5K49&=z=p{MkVtdxNIeRAyyO;BCio{{DCDEy-d5ja=GO zOXT6*d7=i)QFqxEXk`AKoPgQ~54RHms@~q5;@*{ALhg~N!#dmge9aEUL4GAx)7>D$ zmz8}TKg>7oAw{ArLrD1{Q8iDL@HNydIF6_V1oJ)F*Im(HCa8-+!q4TpLmK!=8fwkV zqm8OZX%_TjXs_Z0g&aZ85JXHRLDYWLC`;O)y@(P}1ZjI-eGVQznQCnFqkO=5!MaZ3 z48(`dAsE9&85>=0g6jT92{k}TNpuqyy}r>c!uHq_vZP1U`nROQioTN-Sv3u)23OKj zZA+vMh(iq$-qy=;@G$H1By%N_a(v3Q&4Ga`Z6!+b*6;$pxc+j59xX&GF>F^Xtgb59 z$<`F$*XPMZJLc}`Lb|&}_PqfnA-#Gv{{BErB67A9VcrL|+mS~Paai+FFmw`i4z0Wx z&v+(NY6%ZY5s-f7Hjyg!#)EUd7=FEfZLv1N@Qm>K(9 zF-hU!HL<^fEgTuO%$R|~epBv#UrR7Kh%O|cWSz#E==J2u(M>Kf#^LP!Jb*R*#9Azn zunq~%dzh_*8z}85SIZ%y7A%F%CS6`Ubx{&y{LXWbqE z=5wyc$yNFfi{V~gqQ&o^02mDi-6OkK7qjvMlRMXLF{d%kG0$sN=9%NNJiR|LY_4J| zjU3vEJzblv1aJ8u;k;(ls7FX|NlxgPispsAfN>8douwJHop{EKAd(q#?QsQuY(${U zaRsr)B`bs$oc~Zf!RW9lvtU=u(;F6`dUa$_z?2x}vE{R@7P>KUgT2HK2OPMh1P#e9 zYR0lo-LkS^jXz}}HPD%fgS>QhK?J`FvC&j@T11UQ+s;+-w3P4Md|AHilNgrB4|9PU z2RVX6?sT_fh=Of4Z_iEBfSn@GoHZ*6jx;R~vLoklY|22vC?5!U?Z67MmdO+#gfX1? zsHKy0Wa^haFzL^0on6UmP3Ph-R*z?{YzW7Wj}e>=&Rk>J6kB1!^K^mdqCWqN8k|T9 z;fEDaaK*GwxOsZPQ;7^lAexeo%kKIpZ%_AnC?8t99heJJ%?qb#V{B}4=DAv7%$ z#A@cBwkk%JpD}oDwW{*CiJC9~)O#bt*$-Du>lI?!ye(s#6}$mj&M*rn%1zYP&w{+a zkWeAj)=i;d1MBd(;nBII0{R`Em9y!xRlj&Wi+{0G&kG>b`1NSJp&tM87o)JRHP0xP zX)?leXK`TO1EokH7AQR3xMQxTb%Cr?z7!(^3rclLudK&>E6;XDcq@+r@O3yF!(D6& zd^!xn#Mp1r(IS1r++C?$_iv(hl^*oiLMfFLqguAvXI_Q+(*RJeGN|y;?1@_KuE6c1 z5YW1lVs^nS8LOXAQ9Y{qZPvl18p`(tuIq}wcDd?Nj?_zNo0mq+i z__DgH9PazH1&S)q${2^(YF8O*BnZ>XYhwMe`MvOp+)0{05sD~BXTi?6k;}+~BSW#0 z9~8InRB%vRS(Y$UX+&PY%OFcqU)cnAktwty%&GXzg`&{~YPWF!bh3S$%+-A#)3A-> zr8r%R$;7A!cuv6E@?eW+Ie(UnN7L4YF(x=hU!}CWS(F?5+`{Z0@YS83gY%1}x)chI zd};~#BBv3*B|FEi6$3&h&2d}Ytnm+EI zw{W1)!MmgH+^+!5cm7W*rs&Rr9GaK$zM1uaEyWuFGi>ra*D$+TblJh+?_EHF(*EqQ z4GvfXwDABW8=R6z!PUSEJIiDnH51CyUGuBP{Kcoa04>+sk0913XbU^YqMWWN3cQN4 zsokYmv8RRQa7Z04x76RL9b9+Pz%=FjmXbtJai*AIYf6BxVG902e6ao)aKC3$n0`x^ zI4YRfr}?AgYIN~cU;#L-2ar$dI)3=I9yvIzZs_qhms`m2!8Pb+Lm>+8Oaa5jGr~Nc z@d*b8rbrS0mvIbjwR{*~)g^8P&3F4Z^STNM^?AqkN$99+-2;V5)cn&o*~sw)QqoG) zn@{)JY#P9ZrOKJ88AXyjjVnS5i4tS#Hc6%(`%*GVB~!XIOJkWXbzrqv(x$cIaF@4X zKZyIgO2#=dtfKJ@-IN{mCm-38dz>jxU0bY^*S)J4<6EB&ZMs>~%$W<6d`_JEzSa*E zPAC>x?#!xMa5~wO3FRy}HGqm4m7Acc>XtHBDl_2CoeqUlQu8m%EWRj3fdlqi_^n15 zcNK+%9b4w(d@)QW%2?pN`Zw)rb$WC_#%@jdK*bDBEm$4@fHz&sb9t2x&BDlXeBvNF z6FcKBlS|OL$cGWv(ziZ?XPfXeXEDC+FL`5`7DhKH{yqh(LR0s|QU+IY4N_!_!+a_w=w5%-kA7XeSji-O7Cc1ZBsafXL}aXtkgIsw60j~`_;!sho` z0PQoezqrKp9oR1iY!NuZzDk@C=vT2P7Ugj3lr1fGRYok3Wlh>Fn&p*`F=l|B zdEv>zy@#rNwn&VmOHBRWt*7u^?x1n{h8ZnVZT@Sv3}&x8u_=FYEcl;q4_2l2&G6nI z*K$0lv2$AMt|&%=C6e-Ow_{fU){k{7=PIUEnmTB+DqEdeD~AO(HEp@h;ek$L`d-tx zb`?uuI>71=2x-ztg++U3SY$o;>0yA~(6>7mTrVqCTT zc}>v!L&wV}!Dz3(3)w&8qdPC2${Q)zhDz;HT8IjTxnU&+q(Wb2ZL4xKGaNc-%r+ow z1tlfPBe`X&KW4+4w3k>hy*49SFf|cj8}=d44h^gVW$ln3%uTZl^&iIq#0UYMv<&f( z6cwSE@e+n&1NHy!1Sg2g%FWxRf`q}-;2#&R?sZj%Vsh$hcta6QS)L=q>?%;mlPx|* zYbaQS4_98-D(|u*6F!bZQho!Rryz+n)&aUNhDUuAyG-|bG@G9Sj}~|Huf0apVr7Rd zr}&_SH1;s>-M_HL0U&yXepL6=n_WYe?UM(zUhg2;yvmo`T&blKM>NLZ{5(;;o9hZo zf89^PfW`HCj&g#{`6#a~j1=S?Jrxczbs(?VG9H2Ds?97W?3Vd{uw3oVZIt+$(E2-9 z<;H!_ym(f}1l8AQ{^C>|ZNUVJ4cKzS?_0!7cP2h4nGnCq0B&td@A?%=nJRs^COGlq zx(2PsfxN658VE&IlA75gPVni3wnGP8?E_|7N-7Vsg-|>DzruMj`aX}X=rF(1!l#al zKsPk)Wh@tyKp2|W{}!9Wj4aCTXy^WAfl;!T1OfOF#85$ z41e~xJ_w)g1!QT?38hggnC-q*!*BuWpIm)+6!FHUWFSc+&iVqZA^YNkj5y0GZomhH zuL!301oqPT!qS>j@Ux(cR2Y<+oY_2I>JCMAZdC9_M+h%*1Me)tfv;0&;JUv-@mL5jPsZ<|N}P(h;N7&hYv$LFCdDOBZcw703_)+U#_8>e4P`l!m znWNI>pwa-Wu6u5DGgu4syqOi3*e2SeWr{0V+s>Mi2QrO4s#Qb2-o_zGRtw5MWAy#1 z(kOf_(ZnU~P(tn@fl&kV-7cx~^|0CC!NOuw$6uZkU=vYJXXY8xW&mgZBcYogB( z9B3OZca`|&CSlZzsJz#e3TL(hPVbvP24u-<+fOvvkcB^}vfzs*D-rpgb_56sLV31i zjt)O=Vu?|!$m%u!ek`K1VvnX67aRF@`Q&=lmey;2KCVePe}*}7Wam*JlfGrNK|Ca+ z;Uk%&CBy7`J^rK(qD`DMj`{lxE$fWr3Np%=y?a%?*AlrQ5=9j0E-m8)2al zk}?;yLU~KBKb)%16pnG9E=ie;TU?T|!{g!@1T#5Tfm~H(l>QfR#|&`RsL&=0$5H&L z-V3HcNbd^h&yhLL!}k$@C3K|irPRCV`v~U!ik(x|ZIg+fL8MOgdURs~+eXaVhnn4R z+oyaz=V0Y6>t&nLLznk~VXl+KkoZ{q(M9`0*5#%(IgLZL@4NjM;y=g#+3k1p6$F5Q zSQ7t#tjWI=kbh7i%}7z`;7I?FN4^0el*!*IxMT$*O2mH+o0F^5QK6g7v(T3${zDES zPtG>_#+&>)MCbY!WP%(F{BIUQaug#OYV+46y6r#8WTA30%4BWhZ(K>`4-6H^f3p6S zY8roo2EL`}&C>iBlN|pklr;GofPs`uX!4CK(Q?CZ`j>-Z)Q3WzEZ~NL(DWN)MeBcR zZ(7Chh5c_~NvjwLNzY`6%{>Pg%>(}}ib)0+EP31X+X3|3i5j7~y&N<0-|D{^Eo9Ah z^_a;T|6IS_0z=YF4U2V-@XvKdz$C$3I9T65>}D<;96-!}3L|gcD#LO4zx5@5rx20} zNWf5<)0%Jy{@WwXTOT;G{{mV5y~FPmLbD+luDsCyY7tU0!YT$_^OYDb9{4}i|I?V{ zzZR4P%?dKOE4=?p`R#~p`Q2+)A-H1ymiezzJ_Hvr`O*#zx%vM4m_F10m0Nw2XuhdJ zaLr)dxc_PAx178=dkj}e{J)~_G5)T-2Oh4O83ixx-!lIl=nE@K-2a$zqhjMhi2N@( zSh9@ucN4UA@rW?Lv;Xs4d}qN0S3Bc1S3Bc-vHg!a$%YcI*}4SZ=id?gr|x9M5`2W@ zUlO2*%`|oRwKD%BZ2H7E{imn@z47KSID!n-e^TG0K$d)MLx7Mx#eohF&|0&@9YOY; z(tu0Rh`oFhvk&W3Z_uQLtwgtvVaM<-ZGs@?T5qi&!+L+3hoeq2QD&o_6(SQvvk2?s z)>A8%cLfl%6m`*#axf4IbTJgUroI(ThFd*MPCy)GL%J?R+>LC%Z)HQyEHH5rGWGVy zToWt(sTZQ6i0|kEZYV1UOrB1vxm%J~+>X{jsr##`^C+TR$6?AkLQ!DbUDtJ6>@V<8 z3G|#@D*d@@`?>v-$*;^Qd)rq(dX4ddu1<@Uz=HgJMo`THa6l$w#yoO6Wc3*nZNOf? z*q3`Jroypc_z>|I{RWxP4^x>x=qZ}DgrUe0{~YAZ=U0={mbXL(;D>)26>(V!5WoZ` z6gv$oKaRV&gkz{>3gdEX>wsN#ZufIX4SbHXBHRd`iP}j0r(w$lk@*0dw{vQ%)i{H8 zP4j}#GRd4&I1qvnkeaGEbzBoQvz0AVn$-n;NJ}Vvt79Xy-O0SuMm_fC=;hrjLprZH zvh{dH*`2GK#(a7VpzGw72qV|p;LZx%EIIv;^T;Fw@?ecm`QhEm5XSBjSDE_(m4-hQ zW=XR+_z6Bo4m=b}hznXttv^z(E~f*rHs{Lx&O`-6ood9;0AE)Eszx>x-<99doxV#e zS_CtFXRq2egI8KajlNPEFBm1t4KfuUh4TZ6Gk}1Dix*7+5UAlFj_Sc+Vc*ui5w`F8 zD087K+@J#WAT&Zt29$@I($7XiC>lW$AZlwkV}mV3CC;TX)Xl21<4fI0>H*FgCNuQs z`*Xj9?P<}gO4tQ?CC)hxjdlFiWWCw<$@ipa$F4=x(fdXBH~;VIn9#a%tAOAtLwn}E z?|$edKoXb)2;_~yQt)@^c$f)^M`qAs6&kiYtxBE!A(!^1mdz8=a_Iuc*DzBBR(0B!gjr&*ZVNvy_u#Na5 zW)OWCDnk~M6zWooT_BfspNoe(G9&!KJyN^iN1Ias^!cRy;KGiqE1coOF{@OPF$e+u z8bY~j;kQ9J;~5w2AA)XDOLB4OE>OvmoRAVN+*V1zd7dC`1MBAz)k#8TmDwcvTarfma?UTcjV$@@ z93=S@P#PgWPb0+$JK&>LAt0>9|I1-c0Sth^sO7+qJj4z|UK)ZK;9UwWDv}X7DUC|{ zs7Pp4nmR5GwR^L&mr!P3BtNEL2Txc;uN9>(%YwS z;z#7!;x^64iHR^n5eheQh=*}3wAe-D94YC24m8R*?5Yk9QHaWTR6E$e7rKe*gbbS< zfH$Kx>kg(mzU2Z;P2<#%Nm5uFJg2xCEG;WXCL)BHTEmQ`fLRfVKPn>27_A~>DJU4! zxiB7*Y3XD&tl)SmmFxi&W|9$jCl`vJtJKa4{+*1U)EAJ7x&F7^d3%#ks350ue)pzw zK(INS$%1+JL&q|WNa&rPH)L^dJCj(NCeQ3scK*-o6Smd>dBo;YcwnGkdY+!>OP3B{d zy>3XDl8=t5-jq(+=PAsI(mgWous>GG_@a_amj1|~co++-5H}Y1j77Xeye)5<17KIh z;*Q;rhKMJ>mJ ze6-eTcUO&WR89jCX}~DJMHb!s6!#nZJtATqPW5SI>Y&u9?zG+xieaKIAtj!G$rBX~ zkqk#^x$<3jSp8~80hg5xIv3N>LGs)?A)qCtgH_{aLszp&%keqSEWY?v zbxP*BdD3Aq1(C_)s6}K_N)kp&?sI}lR${K>b_lFG%}RSk$Nay_HnR`oMLPFg!XkFM zu^MHwJQ*E~8+u27la&ViZZP}u@V-aHwo>T*G?u7jG4&$nWGC~q3uIY_1_0&Th}O)f zS;h?*ba8wzf}pM~h{r69{9tm)cCa*{gHV-S?uW8RM-3q2JuR{G*7XPL2A0y?E9Dor zna0;P;i5s%;K-I)wy+ren2SZpGb<16EL4R-2qW8}6U!?E21lO`L5<<5K=AfPKhr@A zk9a?{>K1~M1*3Nq=8)f>22?d{XIPWK0Y?in3(W_3#5alBcu%r_=zTS1X)ml@dYkN( zBQLeI1lP$8F=Q#Ao_q=FaZQr?8KUQi_lOfDx}&)o)r?r7V_OI*kv}F;?jX#8kJ&U9 z|Lty0h}c-TS`=Cwr6&u;E+P|ijEi%f(aJWCOVc)HL)Ar@?|ft31+X|xXcS{?nT?+- zP_Hxhu$jr<{f5^!N}z&aszkYwhZ+0Xjm;M4o7-^-(vbJJYI?@3qPS|QS?})#Nom-v zs!GacZWMe{;(>OJDEOn*0TPN^nQ7qSqz(kc)ef&)4$4`>*!Kz1V1(&dF;USHw}cZz zM<}R>2B~8@Sh%+zt9&mKUbd3KAhx>pWn2zF7Hgz> z%`TZ@?o?1<u z{%+ynz>xoI41f>(&xE}z@(}nM3J9o``2Xj1eNR$Jldo(D2mlwI|JvFUy?6c1Tji$| zHohiNu3KC5T+UBotmN;CG>b0QxL_jAlk5cnMqr5J+`wn9Ht?x_tFwP=5HJOdzQ;|B z)BGmVB0?1tZnDs3-Jtg~R5Mdk-(jgQCog&-Mlccjn*epWSyX@o|1{1NE5aJ|~-t zVwLP*3gO`}a$&#kOK)Kf!&^$eSn0pg<-U|`+B=)+TF7}jBjW#w@ADVrCKh@Z!x(LzVW%FkT8Wo+L z(8yIB&Q>#sjGauXIP5RP-kXPf^nVh#p@_31+1;5BMX`^0l{fWGY!e63t4kBuW8R(w z(g)2{=V6Uy5vnLoRLkCytaA@o^BMI881N=T`vJ4zjfg&sJfo?z^{a5sO7;?S3!0$r zfTBx_=HJ9SUxe6c#45kboW+vhCtf zJeGhxdwR=u%&naI?ID)66a;x~bkO+l3?_e^ed?@A>{9G7#|JAtw-?_Et_3^^ScC?v z8Hfq^?U1t0`J13yKwxjE4+$#H!OSNyU@q_uNPd5I$c6M~EDZ^2;-$xFP}fsggi; zc{+YJJlv0Xw+!m<_CV-iZbz8Ogv!_0UNGTkg+O=G6ukconb%nlD7}K&YL6RMxegp| zmqkUJ&@EjazrE3;V{F6=c{3w)xja$|K+R5MY+qUPxI?G1HS(rK&+y(>h&RxVx;}W zc+%6e)1Ces4-Nhp@hRDRm7!o$Vr`o7Nf5&|-tkfRYTMB3E&SDqE0Qj-6+_r$(N>np zK$j|X(DFpZVEIcEpN2G%X)1a!*67%KXNa%=^=C0<)kFuLu(B^lBv}s_d7I9vM;Kx*JW^u}YW=f5L_c>N%h%-PNSGGM7LFUK7WE%rdaG2x$ZpzG z6A>di#Sbd(#_8m&*scWIvq!eWX-SjC@n&I*EV|=WNo&DIfD;H~5#$1OvI>wTCFi@3TiPj$V&&s@Oo`&w?%*jC5auf zB?^hoXJWUDP;I&(33{UUQb!V3qH#Lyd%;bsz7u=n1vmj3x?)rRnv-QV`$45znV6jq zg`~lmPv(yw%kP<^#HITj43hgC|0&4fDcWv4qSERg0Htg-JWoZ~2hZ-O{t8k7m50C$ z)GWvcQMj88tTV}|Pyc~HK)1V8wQ~B;dTirJqeE@Ui9hYgHU!uB<8c1BpA~nXj0JOs z`{Pt3R>jo%lEFJ^21f+5vY_zesl$Pn;bOPJ3Qhtj+a^M^eF8J(^E!^S2Rcu@54tbG z?p7=9fP|~)9QfCw3|aV_$=3Tqr`PGeQ+bxCt&^oaGQ9WCi~V-#%X2 z!H|nx1>$?A4&VuW$(NEOuHj2yR|)b>iB?4}s$Ev%LxL?Y=mb0HMJ?z{sm2j~OfZzY zyZgb5JGWwt(TK;KG;X^nCX_y5nVLm;d#1bgfQZ25M$~ebz7(?KvsRSCnDyMgF&D~7 z*9JXq+pySAKJ{34n<|Nuj>c($B;2z~Jdmt24_Q}g2L6d$QfPDNZUw@pd)TXDDoXXI z&vZQ_9o%j%w2SiIOJ&K+X-D(kOG=hUaX)a9t-|`BR;qPNKGv=)SYSbyGWMxmTkl^cYb61H~L&sAN|L zT}W56WD&eWUjfK$Va#qJzxr*S3%zpV0pDjO?4tYRds@lB1Jgi?sO&G2sX#5|DRX+dP5Q zE)M5E__rv1l;V31N}TySyx9)Aq}`GK)S^b3{z{oEz0PCWP!>GqITYO^&v;YBCJsu;?6DYfh3L`6f<~RO?~+5M|f%6{Q`6uB;cG!0|qKs z0Ey_u4jJ!RLl%(M)4kx;ep$b6X#>J)S)k6aQ9bXIA9y;S7Qj~&M+|#3s4@h%jr!&&a9Arwxe+s*Har}S zZ(|ztXIo7gp^(2u^13TZagC72keXf7z_(osmhL*2ARlfNcR)j{OWGe!Ks93 zXuq%i1jT--5vEE)*(O?$t5l;XCI?`WOd(I8H zkn)m)wjA1g>!~SiN+c`hbd>ltL8vTTY;S);3pCdWWTqI_kDc=MRC*fUfr6-Q=PzF1 zP4UX0>e3Uzt*L@NNPv4@71cW{T>#9)Z5Z}-pilru)t5~d3E&21@#RgXj2-C#T@KTm z!vqmQ6WaVncX7}IgoYi2rv`|75^in+^|?q>fkf7X8J>@}ra4YuM&ckwN47bs8Nse( z_gp(GE&mDR$F{m<&O&&B?t@qtkM#JK5C0wVz16Ybd~8LQWK)GtUXw>>85R0SV?I5* zvtXPfT2Vf8CBUj{dpOrIt~UNe3&)<#O>{Q2ZyPHz+hY<<4kRtA>_>j^B-p1+Dazqo zX>~*gr(qYaCqz5z*WoYJ>d2!vs|?YE)yih~XlX~z&n|rlam5fbt(;}`HsSC0aIhgN zaGyiPMChk6UNGdECJN!Av542Okpz`%zcS{%QXRx@0YF-I=>QFhP_ho|Cq;UpBT?gW z0)bQHdd}HFcr}5ga(L{UHv*|rkp8}XWJgthhITjMjVgkra7O~>$5R%GGJ9&da&^81 z6{CuJP}J6v@z--!pHNpjr$V0U3B0x>NWd`T<4|V@$Qm_Do&Rr3U~_tm=qoN&SzPvp z4K{Vt3;n#3KJP;& zHopgG10$S%_q2V6;On#G!q;0*XjY(+|8AHpgstQ5Tgwo0jSVB#b7{KsT(9;utD&`i zp1-B!-*!<5&~fDHXLvfB*ad_P>V=(AwItqa9Kf-<6KQO;HF!$*IJy~p9{;lq<0Dha z#mig$Dc$Ltm-U4sG`n^^%#uLlgWYkSl*6M)w@&Df&L1m@stNfJd=%%3={rcS61kyJ zL;X^M3jQjm&B4vi0ySmxqUh4|F9!|4ZWs*_!0Xs9&ExogY3o*dVH)`KOay(|tocKm z4gl3CqrJ3XHw+l{E!3HX)O3&*YzcK3O)nwE0BV^smLRdzKvMnK z^EbTIqH`aD+Hnn#yJ2!k4a->U-%tX|jpq&c>e%#qih4gL(rT86$(1dW_b+r~Gmjf* zlIbwUjgsIU$q&#f!;!@uW7wt3p=rGr0|06Wc+18Q%p|g8zGNdtHP`SJd8P7X09RIOPD+4YNCGLl`vimQHH>R^x}0A z9YFnW{*%VAT+d2;$V+rbzmxo;{ai2;Ueh$8xU9JEJj>!QB^o`D2%M=-qa7?*%>Y}} z3p4B@`mHku3|%aWgiE_P9^<){XY+0#KeaLpYM=Ol8aLE!0J`DT+ssQEFtG>;^tH~uWzS)3YVpw`lzPh*|q#Mfh;AN<&h5D3GM2-XvwPYl+a?I; z@0Yt3E%+9|E5i;vXto(TMyyXG>i|lU2CoF0aD`*kKN`7S&{so^ii<;dqt=8V;byS) z&r2rnq-ilP*YR=w%)R&MmVsI!rC0FeRZ&e%)jt&Msj0k~t)p*JXjqMls*?hBp?JIl8`3ZlwS7mVOu+uaIxDE^vai5)U~ zf@ZeR>T_y}QU>E2CS(%j%FFhe43nt9+OS}p$D%^yDVHxOK}-spHESc?MJeVza?ut% zm|XNCUBbksd~d{Txixe&Pz}&1{<{H+5Ps66_NXFiP864gADbHDl=3tz&l@S&991Y_ zqbz3dfUL_HLGAyQ!%8a8$jY@2#sE~-%s7caQccvp{YQ(`HMwuhh;!pnm<++%@Yx&3 zaKVU6qle{T2clMrShCBITZ)%_f^GX;Dt_6XR@njDR-T(9F8vZXxE%mZ9J6g*ABkw6 zPaFDk&=QDvi*eymf_xbgnj}^wpH=gmI5KL6b|1dOv}r3t;<QYh5cQ$lnQ8 zLMuYdc^GsVCJwyA!nRmD>SFg9A{D*0<2q$U`k;*;2ZG4wDvf3odV4!P7;WN98BJ}C zWZlx(6J&npa2(fPPFNm~xVv*Q<658*nx3=EnjTO9wc36vLA`iDH&${mGpxN-4;ZRj$C)S<(?E+JGjQqQIS(09=UTBvb z6+6up+6OLs@eEu{CnHzX8ci_X<$or~(!q>lBh3tX%{J{wiC zbhhjeMe?-_VFp@Hmqc);HevQ6nLJ1Uyng_UG!n+Cv1~wlb}!@4^Gy&FTl}DLt3d%x zywQQ6HDl6=c2FE()Ba2|Rf0l+{uZf+n5Tx)hWvnV2wakO zYZ`139R^BiasVAP?J8>J$S`OML(vW`(BJq!2iCNkf}iNI#PU^!Vv?EJkj1 znxQMs>gvjH$ub5f*~5xce%9p~SuQE7BAq%3-51|2RR`>j%WXt2I;uekq{emp);>aa zj`3Y%|;0U{;jMHWj;x^)K# z3Tsyp-Vk#!a_Cvr#Lv_55Aq`=ejo2R5_$*u; zJP`vAEhtzA7|&->6@y2Es}-b+JlZC)Mr@_?dk_G(=<=s>bF(xL}mo25Z9hp!|?0kj~o)68ZlSkU0yLLvUtNni31Ui*AHV7tdWDc zXhCmb^f?W4{#xlneUnrL=`X?oR^fJ$&s3Odkc0oj+T3DGP6Jde8 zXhrZ{ZCye0)52mr>4q7(6e=|jO-vn-sF4Ojjjun#i2I#3U7F06Vn9Eb&W3@N7Q>gg zBum3*QQer{Bum5SDAhJC*T!6d!%nJj8p&d18AGabkUoH1y)9@hC@>7H3y)%=HKNq1 z;77?osz5p2D+8t~{fi4<>z1DS?Gp+)ADhaoh>WzhLYaHBaFzQ@N8*5)p&Xn(ubleBt1gH0ugdKHn$WB<=jtPKZ>1`{nK{2_!2J= zFD z2!_H(#_8F@DeW@NVeL9?2&?KWx+?16@KB9g=YeA*kYRd_ z0ie_Bvs@k2P)}~2@0)|~4T$%C%Oh|5SYYjAdtcsStj6@mw9qKbmGqT=rMa$5akU#H z0)E28bTG3rCcY>{Wqd9Cp*bDKY?iao1Avg_TDATa?yrVTFLpfJ(mJRL>A{gJ?sqKT zzt0-JT&mBvGR3F&ENw@JwM1p z+UxFHnECkYjqhOUR3)lqWY?hK`#N`QZ>Yq4&NW1|JDf!*yE}EyqE;K*sAqF6nB0s1 z*^XL8!3}&S&2{ftr`FPwTRB-8fPj{99psn!?y_&Lc4WEm)8!%5fRo^9?ny<(y7*qe zZf(uMW~6c`HS=C>o-KAAfzG}C#ll=->(D5vt>ND=;ZZw{b2GohKaR)n`}}3_cO^2i zcZz_{T(j0gx*-cD+G8 zlq_kA)~%&Ff*(DJ5u#Dq2}5%v?{_iFsEdU zPY`XJ;zi;QJsyNY?~aqfbQdK`%Ru5*R3!M>2aeEWM2Wc3d}_yY;*rsDvHfWF4w$(0EqR(ZJtV%!H~`0FPXPCa!Pwwz%42KRek{qwyZgQ*P&vI z83+Pai@Utardw1DFK!r;Helb6;mvhXI1luIr!r@@rzd9PQztkpHpni+c=R9V)AFcp z2U1SLWsNq@EC$lbG@uuv;!__j9;m^id5|NUdC-K;#OS-l2?Pf92B09!W<0VBec(j` z{Y}#nYoUoQs?)Uy(PTi?(+qP}nwx>R|&8h8E+qP{_ZF}bF`}6$1 z|D3EOJ9n~@tg~|OeeLT7scFzUVBICKIrBSh*_0fh5uTb_v5tfZmk^~4`z`nB4h_GG z?9`B_1C3tAI6BDLn76a|Dm%*VnxVjCTynN>Jr|@u`9n^kpN)Y`k>#~taP&FFaH{y{ z>B2gjkm<{u+m!!LbgC2J%|3xqBkB9v?C#xJN?=u6*Qj#NQIvJ^#2K98Q@5?Z-#DJL zY-LXTfD}IHG7QAfE1Z?IpOYkPvA-19lB6~CNryaaV#7i!tUGhdj|Oq1!#Ux)bY~6m zKB3gf2avmSe@j!M6x>8<-pmfaU8o{cRzzohO>;r8gZ6+b7P=Wp0 zH`|9;tgKRp^+Cz0V@&il;#KGt%>IH*^H$WZFLKEhv6qO)=|F`GHNz+1NT(q$5SB26 zpqywQJ&0qZNfuDSZoo9h;83ZCVOH40fV+7e3#dkuIw(vj3+>SO zKrv!0Vg+k{t zoLE6#|4ecxpGu*D4Iva(vZu$Os|;4y*o17#87Jri(fmw0Dqnx4r(VT`4u`3PT2a6-;>taJP5Sw-T2nLi;tvg1Vnwj`jCCC|uq^y3XB@ zourIc`D~&^bprYRw>SChNLWsh=$%sIS9-LL(YG8 zzU>QE7f_Xm?cDhDQfz?91j3(mh)|WD%+krYP5}VB2?Ys=Mis-g&U|X7oqHZZt_$(5})#< zZdd?sK5QRy>&_ho)*Hnk51Jd|QoV1?pKtrT2?`@p3v^j5i$MHS)2ztI6f65EUTyB~ z-G+g~Xvd;gHP3D{657{T_`fv{1C=h2j=ahtfrf5RXG6$#5P&$urJ=UhZF` z&@{0Aq?9Zw5`A2h`+KAZIUzMSd3J2@_C$cypd;F+8@P}aSVYNi6XFG$&%hiK{uLJv zJlj!#u@d@Z-H?Uo>$}Z1?tvb7rxOFe;W(+Gx9O{n^ENIk%=Xeh9H(I_)fEw8x9!-a z)!{4_mwyKjnalui zcIwL$9mfYMPJ9x_F**q5LE2;0{7}&}eBbmdNA+iA>>NJdlN_{&_xc8O3>8_=321XP zbcv}52L>RN6$MXoxzjOD6-W+=y4v;e05{kh<8F_LpoK2eYD2z7&I-o`5~R@-*O*s2 zUtI!9Mb0cBLE4^->eZ7A0U|+c4B&w65^qLMp`g`c&(wTdehygI5&QKxcAWJLLemxb zolCda+6ugU9g;vq?a1cXk;w;FIH>Pt-rf}xEz)@^-cSc!IxQ{r%$A~#oPf%rnc`24 zv~QPeZq{Zy?CzEZQ4>})Y|8oyg`{Den58m11dKymYQ^=}zH^qCQ8#Ef!7)GqH-dXO z2sVu98-jn7xK%yI9?wtbH@no+(BW5!N+sCXQy%*q8-l8ysbuSh(k1h=uH)kA?SAu_ z9XiQQyo)-;4YAbP81-0z=yBRa%;-DX`B)NEFOGDQI|zFwmrlBYdt>cH4%}C%x6{qz z(sX#;NQ|Ws$tf>a_17_{@9+PyXiiPoY_iC%NjB|GwQe)()YD1haYS=^nD2f8Z`jV+{dCdSuRU;3E?SEp1+L8dsL6tBmFs-c)u$GcSpw!m^1IlWhBVc6qa?rxvzu zq2`sR%zR<)Cs0(wf93flJJr^l8Q8q%L?AJ)VG_)3ZS(8Yd?uF$Y8s%Dz(gr}g%ndO zTF7L{t)57AKr(Qtkjr$!s-8+|f?n11#F4R>?-7o0j8=w|YUz5vhzMFK70{xZtKF`+ zTv5*LT;U&Clsi=_>T03t7Zk?*Wfjh)FHl3?BF9h5{ z)8p-FEyd7&1G6bbJ?6_{cM~B>Apazx#pD8&X>Ylgd~>lW1&|z@Wx4Ow-08W|gRqtD zTp|j&A|gt1_?&x>Yb0fG=UIg3tE<`5k+ZtaOd$4`i>cToPfd-}tCO)-AX${TWNOMeF4EPQMDCG+JpL)N&vX z3)E^20Q7vU>CTjnGD+cXmBE)3b>iWP`!~)W0$DfV$C=fi;X@Ek@JUxR8Eci+!}TRx zuD_)R8An9e;}v^&yGmbu!=L>zcP3YN!g0ZQpTvFvfY3?L%)Krz^hX53cK#-PHX)9xfZ!8y zi~B?Mlq1E5AVEYCFHYi!T7S}PuG0?~l7UMEQ_%n2 zozYQqn#*;EehfK^Wm$%^fCy`k0H$o$13%fiPD2XNYgCWNY=OPA3rcmkEflMqgX!yl zt_L;J>bkIejmd(qys zjEGcn#U@2{Y@h!gv-t>;^+WYqW!h5l!_#{hUtn!!*@iYDahFH7dxJX&aclMsOfT;k z^EQk7xm!1V1J`wGHxuo2ck;XCYA7mA$Ieh4C2rD7Ci|=8;L--F8ORk|R}tDd2Y8~a zt%AQ%Y7FXPW|c8-8&$^XGXPgwgZ!bbl}3SKn~7^G8prjVP-#5rgez2qVkC0oDq=I_ z;+$IiCSjQl0h6m5Bnv;%5BG_^(^c8<4CG_72bO?ZEH{W5&6&yGq z4ek$O%U5K19pe*{N>ql}d=iHaF5KTilb>8^S#}hBhk6wQTECT)`d@zVJq|+KPE6xq zvutL&(o0WD0#|5sf9dj?H0#u3rHS?^z547MB{L77k5~tl+c4|WOAkr{fP0?~xX{Jt zFIT8^7!ONH0=`3+AtWF{lyz7Br{z;mv-wsg89MsG&OE`q3SrDgnf=GI`PRC?va|sR zNuU5F_HV0w8w6iRr)KDLRe7Sg`AVmvkm{40*(MhT6KNcmOC!cWIf=Mb!9QVtd;`B| z12-yn{LXz@`dEb`DRrrKB;iJ_5bZ!N`Sb?`uRb%s+~2N8ZJLBLG(KfkJ>FsLJSK?G z1RIP_DRgS?#WfuwDy32!^@*faOOAg7zp6Eo1k8~{8j;*?2%iwnZmS*SU~8rdXK9Al zx<~G7NR;Duw@w5=y`jzjsY!s_q**{&_l}{{YgAj8VgAZd_Fk)6F^zhMm2u!ZE034J zz6~k|U*yEHYu2Z%E^3H-)!5p=h@xUK8dR;h$o10*>87sG6f9_J0WKYJ*-5sH0mM>N zQae_YF6=1!S6DFL+Fv5>V#hZk!%#0GL;nc-f|yWk@Q`LenVW!M3J{yM`xyA3oHD5N zQ`+3!R$1~P6OY~?Uw6nHhT3&kg(}I)L+>;?J!g;p?~X(3hsjOYhQIPsV!S@P+rLLX zKUDJIuj<(>YCVSRmv+v(IYCJQL$9mQ3UQt%NLCu8j^T@QxHx{gjQ_{l4uvSqA% zi@0IBr#TjY#!t*7VLZb#qkKPwE-Wu+s9FUcah`alL?efSqzqT)mhhNWKUJj6abR?w zO0&t_kZ<_HqK2_JQ2aao`nUa?r?cWrmCa~~L-nUqz`7uv-@u3CUI~`{+sSMn1eHM8(?ORVH#F|ke zHGDiL3LH2mEX1jdIVdHH-#)_K^L6}H)3`2d*Qg@_HkKW@f6u;;4BWa)Af9jBc9~>--)9EhA^FIFi zOa#L~id~vPRa$3)>tn~sI}R@#nd2B`!a17<@GQAax_)XA>iT5MeLig$On(g6CPw-T zKp;AWfBw?mE4+|PzOe7(=Ye@HF7WD+g999goWh}PqyCPGafou zvFs=r6|xH_*zxqz+R-;#w|=IInjV2$w-_7 zF7i84^W>=e_{n8kNhn< zS9iw-yd5QbujR`7s?T%z5EN~`ro+sQM1lhhf?gNmpq%A4uveTZaUm+J;>P%)xQzdO zO8|`x#rr_23p8HJ=|NXDtl0ZT%qMgKT@h-kQ5m7XcKN(0mhOQ4Zwom`(B%lu9L3Wj z;CT%JIsKMBH-4p6(e2JvaCCMoBN~HFYr*iHM_lP-BNtTnPS8!HE~QwT6^ThY{hUH0 z=axkvEY^2gCZCmw#eZyheC{9rU@h|0@%V(@pi4)VL8%s5DPW;mx917Z4K%j`8k*D7 zD;Tyvb;z#0Ma;C2S%_H3SPc{XVz^t8Va_81jYIp`h8npqz}oi~ADHmotfacq{JBzP zvo(jf>+V&Ry~lRrH%V~8Ny!la6uq_TuLe zCivq`_cT6|bbOC?r`%zl zu}QpZENv#xSon4lj3Kri++SnD;9E8B$JvGLrIIU|JBR3|2qU6`qvoFg<8p0|C8g@n zldMZt3)3A=$2_mYvfM5N%y5G-ryX9wZOyMPT!g*@+9g9KEHTMfo+7!#J|#-EtR1@N zAb&~v{4AQ3k&i5m_4x&-D{iLqiu)_0_h7Pbz&Q{2x>ZE?BBtfXMil`i0f&LwD$>n) z3H+ZqRaBk>?ucwtnLkBoS-^04a5x_JS~3fN;t3zCZCTOmOmT(y!cB(T=DIRK`tl>>e@%6|vY#gD6rp%QN%02L#g;}LsQ?WLkhiG~7 z{hU_1huq+I^Jb!xF> zJ&w%CXaS>v-^OzNE>;3S_hn5;Hu0(Zs^@q2<7fiuj-ad$voYa{9y~=vXRSeB5 z%N+ics|=v06KipFoltFuw=8M?gO9yIN(r4FN43o=7gibn&erB}v@{x)%uXKD%^!9Y z^j3|!G-ouv2k^RgT1RPi!pi6VPc@I2MQ*>GlX+G*sL=T=oQTDJA2Ip^g4|&y@?u2H zE_ESrx>$dH*5cGMglZMIGCG~6kyKH3M3mh0jR?N&5`}n^E=YSYRzr!X%=&N$Xoc55 zmnJwkMg;8we?-O%+(!JmkiIuQdZqIGQ!V-H?aW@|2KhA`60doVOe5@PNdvt3%m!nw zG$p7w(ciXTfO5e0Dm*|7x(o8^w>N?%^3}4YreZdQq|ztFqn1WTym%U=V*GSn9|?O^ zZZROH`o1}G*a@|TUL@`UCe*AQKj!R+%1agIXLW$tfbn(E8b?oO?w(?<`?V-mdkW(s z;NS7|Vr!m);!NH%^_oyzyaH2$|KPNUHDS`JW@z zn8C7tG)2xmItAc@cyyKdCaprP1}MPy?9kIHRwPX6lkM?`_^;F}hOs(n%Lw;+J@dahuT#fZHU&{YVD2Rr z6@1UX@8WHqfP^%!=r*`pLmf;q9X-N@=l(pxXA0gUAX&Mbz`@U;>y)m8*UwLdrU~Hl z)b;IZdVK-r0A=I+;naPfO#2x(dM3vQSixk$*2*@dUy;!`R}}5aNM`E>&80zv4RP|( z8IfC7ZnA6ZQ#dwHZOCH3>Uz6-sw&Gf=mxwEF1C7tMJuw!C zT_q82K=H#Nx}!`)9b<}(rh_8?V*;oUgjZ4zrOu({X&LDB(cUU*=woX(&(E+%M`JEW zEA=yv>`x|yG$zx(E(mU!2jBjME@fbH5++I+j6`)^XTg}kh%7I;7?DKndb%=#lbPO@ zN?7KmWRIlHDRxCyO@#+0FyEnUo!M!mxD8yi3yiXK znl1sVT5(=yWtulSd=>cD)qrL+Q_dfal#WiWFj?{JJsNp67>R4yh~|j0b5~q$&$bvK zvI%E4c$Is44ih;#>KW`W)qr&jC0EwW66M~`e0N)DS5X0hrD5z z>H7@;O@Hyc=ZQQggny>yBr!21c36RnPyuc^E(9BdG|dcj$aFi+FQpuz%+C2s9Ym&= z-1YY%ZnKjL7scV_?a1RFth8W9HTq`DtK*C8PdtDGX+G34Wlz@DkUkN{yE~9PhU(|k zE^K3(rK~Ygxoi)kYJlWV0{@?e1bwM}Trkn(t0K2kIri{&&|i&1;joZ?am`5@{6uva zHWt^0jT(GY9nI(k6Qa;|+N%8ac3S#&E-PkU49#(*u zW{PT)U<~#)nsIi*^7-Gz%&8#mb!wfG+mdq)Y)Q&R#2xbUwy;LwHm>v>f$7WsB3D`o zCO=qYy=U++!2qTA!UMAym9!kXZ3CUhBlJJAih8tH?V%R$`9*rDt#s!9-<7W-u zcEJ+P?WG*u7sjkF4VypWNMBCf54j@HPba3!qn_7i=mGPdp_n2wvox)B|WN)FOL~HoUo1qm{04W((Pj z(wD*in+GblU{-YkM<@{rs9iB3&*hGnz}(x2il3t)>|<877s;FEOq{t0l@o&~*cUwN zWyNYb!8e{8v7797xZpgb21sC57fQcpy4tZ~!P~lM%cOx=JmIKC$1GOfft?WYchRsU zE*#~*0l?62M6M(~MKc3!dvM4v8rv*5Vz*dl-hkAffrDC3rW!vYzNg1FA5)^O!aI}p zF;B_J-?WGdjcXzIh05mB)a-4e{E+GOWs~@u1{MLAKsZI|&(*~|!7l#~F}*I|ujez$ zuhlonti`Hu*oJ#{HS<)g>lLFIc*M!n<}RWU!1LhHftu668q7h@L1G=`t<674Uz2(& zg0msgd)c6avBPfqFo~nSlsNvSE{(y88da=*>u9k6tMQ0jI}5mfqH3BsezJ6-)7Gp-ka2!cw2+=9+#Y z1o(Bk*Q0PWZ6%HpYXbwmEBokN0#qh7;4<>Y_>`}=me_H35P5sy2cfO@etQh8eg~a! zb{&^h6kL_>vkNlIgInwoc?VI}1&(K(01t)%2mTBUeGO|UQ+ZG3+6P-^d;WtA?uULW z1{w?ADS23&rY@D%?)h?E#TwD{)XM}}W}aSAY#BO=DoGSmaxOLu6cvv306L6*Qt{3P zdTqJ{#?9^6>B`)gNCsMS6Sx{n1v4g;P(EG-^iVb7&2{qgC-?pbPwj&3je#w5K#91S zZz7uI15RhOE!}UVM;!Ej6ZY^j*v*QCXDi7L^X5moM7liU$->9v$y$DrN$GOK^g42S zKZjW{a|3vzOEHECVNI|RcxG<9d~f1pTu}Q^FJ~AUa^4^8dX02=33$$lYBN~KQb#%i z*jUwiveZWW`|tW1UHBOx!BkY)Wl^cd||3zu_kJq@io?L5AbV{yEBI9zkQwfE|v2OATilt{Z| zLK0zveTz`~x3W0p=D{PQI13EKF&kR6<^e>=3$C{EQZ5FZ&%K;uzeB6zLAnYzw{j zB0D7{*2}Fnj&UdXCCdUDIG3(lqtt!1a-a<*?LlLm=^x!9A~{b0FT%YBE$0j!hL07V zy@^O{(bfZ%F<61Sv*rL>f7I&wk15n5v5@e#+Q|Ea715pEVbYSC`5it-^MK(|{mACb zTN(>?)yM9qx&Y7On(FDJKTg6PLRQ=pj_7Zy0(6`Zw`4dm-Cf`+8rxrBbLqFtNUPn? zfw8<%snoKB z&vBF6Oqqvzc>h>IcAU|J(c2%al(ThdR!F8^Ns-5lOI}>X5}w+3{r`HZU;4APja!u1 z6`cGmD^W}g*5xL*ZS=vr8B9`sNB=_g>X08|DH3DBlcr1r@Cf=Ccqle|&OI%-$Pn6$ z5wze&KG-$#%a}m z&hCvfwqJ1&V6oKJo4ht`;nx_0+vcq-3Ma`fNDQR()ajko^o1!i&m1dMqO@9AQJA*~ z?1u5rVFu^`Rzj42{upMo7SGabh7KCb`c)n%l5!_r$7EuLXot(QEMsK0(V|OltGNRn z?n#EtZQszz_PXFS?o2Hq(tYez9LCce%|)pR(?p+pE2DJ~Cp087?~S<+sBnfG)!y8K z#w>-A&xwbDWGSf2`)8a5a(?oO?f!JfRVr%lt*}r4Ljlss_(d+~Z3%FpEs{KCI#_&> z3J>i}%;DoNtbu&~SMDIf7@6U+LnmtYsD=&&bw)bHE=Y8|A~`|j6RjS17LCSLnZ9ApiOV)D-qjr?{5a z7Xk93mmECe7iV0R0+_VSgHKrlkcb2W0M%E^)7ZK)k*BONnLMP^94xQ?daiQ+2dxYM znuwgbf7&)0`*7)!2&;{ZciSKX=H@1`O`#Le7vdXBfTTY-5+2~ZoPl`~v@yr7u>gX? zfg3kz*$%h$ETKZW@zKlRytm7{PMTf9Ub^bf=&zb84D`>)*#DPb9)e8Ap4ciK{kQIS zl%^scei$iD?8=0NzP}kWXDtsoUf&TQHN6R1ZtFGe&|krntN6OVzgJgoQWkN#RGqRy zhOM(~qoSQiOgL0V}5Gtl0>EDJ-gTL68W;)1I` z20>u&88+i179CY3j4ohwq_@~l(Q+U5h0QtnGC@4HC zH;dLA1J&8#vDdO}SEbC6*s=kT31jwNJR+1(R)Sm9rO=>de1n0Jt1|{d zJLQL`eJM!0z`y&CEStgJ|0&iIvb|Q&Ia-=~DgWIX(0~5MA(p4P-xCP23-_KuT>H+( zH)-siIRooF+PtX;k(-b=nJqT)Pt=VG*ZI`wn<<_RA6{5%c)myo=MxFo@kxcbgyiac z$1if5$&F%=Al15r4d+rDwbyv{ep0rLR9mkh^EoTe-n2K@wuCuFaF%F4SPnnYe>nd= zQmJ<>FM+WdkKP)sx8LG^*gn3tlG_ivh2E~U>Ei1MQMoqcs=qrBI|O@L?az4;x$qUV zJW>^}v$}0IJUp=ND-i@}4o$AAnH-0WTlOcs;&1J&1UjvwD`@-S%*Z#l@idDu)tg8g zKR_WaTQ#k@YebwB{^ZN$>gkO|%|`#H{RQ0u_ezKVG>LvzBS3Rfv!TSO;Y+N(6#hU>CB?aAR9NLra- z`F`%yCqQcl>S>@5(j2~Wh7-V#)qbJ z^>Ef@R1x6xN1aW?299!h+cG`-(t2g1pEct)64g#spt~9m1GM2Mi?9q-rLxL}4Wt+O z&Db#~2$wy#Kgj!9Xy{QM@#t;gF{}N_%7_9Hd=fxEyXC>c4KlpaG#p z`~tv1z6o4zZ!8?3^ToU$~Ot(4}gQ2A;82YL{$=fS;_j;E9Au%4D%=~Ukeky z^i_VHFp35h4ss(;TpW76g*c*?vMtBqiYTI1pbf_0N>O4X*!-nT4O8_MA&DhVYT_`2 zyY_|;u&(JjR;NvV8eJn`Lj(mLsl9*a%kZB(07&qUK?jTw17V@}Mt3d52RPTV1sJG+ zMB|ODABFSKjag{Ui7K09gfZY{x_!}7c4qg)@Sb{Y%MMj3nJ%y-rhe2ScE%WF2?e=7 zzi60Hi}3nM>v{Td??{}FXq2$k+L5Q%-FF@aHh-bLt)lUmBb>a(GSWQ?glxsgu`jKb zEk3Ouc>ca2;>D-Ss@OG}iq>re0NTGZ62+%?BDXk|vnZ}&w{`synl zv=-fgl!!H>QNgzHB-ZM=$>`r5b&rz#pLx@ztB3d(%Zn^sqp)F(g)~zl<_GvLY;X+& za6XO1v_LD4<+)ifNLfpKzRw`i4KLa-g$wR<9NH$YPaTSR-N?b zql%S{_yBsrY-_p-A#%W%1uMB?Du);smFJ0VJ#FcvY6dE;b{6($8f5{*xK=3f^|&pz zmNv!OozsXCY;y@9IX%&|w`eN_3(lfHDyb1SLsBxyS(S`Kxscz0o=w^5=7v7&1Mx*O z@5$~`49LXWY5xZ~!OX5X)Xvct+akUsc<8{zEOxt#i?2S+$Q)psKWneiM@oYcJ_@^v zn)W&izgiW)z_gqcT9f<9hegaZX*V0?cl6gh_@XQ8NrlA*t9nSJWQU?I6_9RH0YPu6`74J7~#&kF;$WR=hu z5B~l5^UvR$194@|PL)2YJdqiz_4uGOdXaT2gA5QWcpaN;hC}#^=Qh>ZJ5oNFms0Qr z(MR&6d*#fl7Ebr!a!>i9E?JHj(VZviKTEJsSj8=D@wki0XS;)64EVpuHt(LSc5UXq zCPq!ow9JuA10IRGav9|Xt$d6v*{)A(_q{=i&pZ*Q0g3~(*h*nhn?Ck%6WvEml6)0`feC@d?8Ne{?mBuUxu`f4j=dC+0IP`P1>G9t*_0Y*S5kFov#4 zNIN~*`&6rDVMwb6**pSPi9{#7{#Y?4SV3lxqd^>*rZ+KjZ7j}wf(}t!ISPZ&7Zv>j z|Iah*9<(?EHOe{<~f`8v(LTVLt#`+G!H2 zbzzc-fdrtMKPJ7xC5F9K8?6W^{0dtw{F5BPE^x7J$F_6mFQ5oYi4z;|^NRU3KZ3FM za#pUx?7wVr^V(GbFLQzt@&m9xVS5(7sBQ(*Cvh10-UTi7*9vi3z{A~nhzdRsCx0he zSFBDu;Q5H>RHs;nNy45@;fJQM=b`K#U*$!QZ7O z#}bgiYS$OG_i&4W{p^n_NT4@tY=owh+Ye^`n4Zqaleet<82S>J&Ie%X`G@`GS1rc# zz6u4;(V_4@dkr1+gPyE|c0q9ZXd3Kh<>6O8#A)IyOHBvXPp`@VXSXyFB@TJ>&^<;W zM!>TgVVPFf{4tQTFDO*obah;YFjaLJkS@<16<ta2Bipn*s?63_!I^7 zAdv|vGaU5=+JgpIyCT&@x18bS*E7L9#Lo$=y9zvGhg(@e(s^jE+LB;gJL zU%JDIK=(EO&OiV3^$+{FHBHkcypT`mUjs#vzrqfT7}VKYrw<4nZ30pG3kAeRTqgGY z(H2g9ZK9h^4gxzj1dR?)v?e^6s+!-fu=m=CRSGt6BD19_R0(l$Vsa-za_07AtY(V*x!3^`j+{zPFXIslF*Z@2GI|;!9zQU5Yi1$-2%#HS;+03QpdPcmnwm@h@1CZ!~e*}F75+8_}-A@z?Vs*#890hg#7pwf53?Bp+4>2%464w`zj*1TP z?+1l$j4|NB22EsYLYKYp0=n-JLL4@h$ooY@I`?@g39(b=3GGUz44<E$^W@NMmExe+=KL0?ir<5jU&63StBl zux9UhPoi+G=cC{9&R6=naQLWW)Onl?wwlBA2?xBDee}r=yE48pcLRHv1bzYqIPz-u z6a;e`6UCE&6*6|scgqp?9~Bp5IwN4tx<}9vo*=&JQQe%>QY>TqX7I9IuSe-0;o$*0 z@=q7YpEiN#z5|jdnjz%n%uCqZKdA6vsv)iJ&i(f(y!(kn$Uvop0tQ~mO^D+OzIgrL z+W;>&66FLl1>R;*=y`uMzTfe`NY%L^!EEWUc1mN}wOVl^?dvNhGy>bAKLMhwl&#Pt z`yzqZ;CD`eN@NX+Bw7II4%fVy=Z{%fT_s zhFm3tFIj~@87aR^o6kwB)HO-_WIb%7lL5d&-6=&E>9A#sV7cAdpDH&>?(_ZGmF-zR z)-$Vmq&#vIR*5;<+v7HB57V1i>{5z5eFQg&*p$%07*h1BxrZ0=Qc|MFjkQSCn^~&; zZ?)T_Z?%#hFX4(f((=FIG(BziT*^@4b#RNF<&NX{y)KAW0w|p4)omB6mb=E|7y%g% zva;!sEO{)pC8Q-6!)MTLwB|{|NoZg{z>Sk;$Y$IULFuefL6$Wg6pZQh-@KrK`08b! zndV9Ur8GI#;^@uNqX=ai-k3$wV0Dt9rA8Tj=OBe7co-l{R9~5mX0nWDolK9_e;8b6 z?9PbuwO!B>PfMD$>&vIFyIqpZS^&LfTfsRq*9F5Inymlm=$JuV?y|e&OwP+l`%b!5 z8NocI_I2BFYl&uh;0$)+3&`t1t2&ZB$U?OCnFu2G`f{MGQ=O9OV z1L3`Zjjnw6>t;Lr5W)7^>Y?#xZHf8I5f}-m+eUEBO+~I9D1HNZ#8!6KOTf-miv`P- zZxJU%PeUsBOn}9&y8aQ}28%eyRqR&T{J&1)UyYrAJR<2WMz=DtdlGyc%9u1uwhR-i z9HwdhY2$m~3jM`&-Lzke70mvnp8X4#ep!|yIQrYdOb;OE+D|>#Z8WYILGrG-?H`A<^KJvGQ`xCTs@uvb(pHEL z?=QHToZBiFLT{Rr{2eTu-=znVT1#}N z&0T-vQqTLRd_0)F`~nN@iM1uJvD<3+x5(mTza`*vpXt-`7nVcL=*&37ZiZ={j&V}8 z@!{Nx4t_uht*OSvheWo2iP1d`)L&Gt_sV55=F7g`4%b>Y@b*-Lf9&|)NA_F2TGXkv z6V9#bZ)x5#&6j<`t?B^f^lxp>x)r;mo|g~VaqMpQLv@#_Ed9sCK7uaq`h@HtYwLHl zTgPkNwZ`qyoqJJczoG;Ty=vKzyiB_SGEg%&{e+4(CuEbWT;oLR?7S`2=Vpyqqr-p! z*_^ju#`0kNwey#6DnmI&GE!9$@n*j|4_x}a-}hJiS)rHu*ahI1St>(X zeK}d9{POSJK*#Z=1S89KyVCxf4iB^c{2e=;Sg&j-V^1A$J~yW|HeuKRo;iQlyA^na zQ5!GD*&Z=vQ~b(i z)M&Xdlr7Y%h z*rMSLtfe%KZXRGvtZdF2tQE?-;p3*YZJVNo@nU`6%Y@vY#(y!a`NP>LJyrRKCF>?= z-u9WeD+}Nf&%4%JojqvSU1X;#^!GOLtMOy3WjLX8daCjmdlRRHF*iefn(%qr!b06O z^o#X-@euTtn9*DUei=VSN4vYa0`ZhJ`5k<>;Q_d&VXex{v$ZWhAOGI6-H|*6w27;( zetA-0X{>B-yk`5}O?h!K`@M5$1IN!J7w|o}yLra^rhc*-+9#gI#h-GxhsusOBrkE&cEH*+qQI?EUrNLy<}+9F)nuP7&e{?3eP4eEWN+({w4g+o%#J-6CG_t3k2k)6bwX3790W% z1R5F|MqDT3&b?FDOm&5<#VWjWbf0Hxf+=*jQ z{^MZ$k9ETDK#AXK5J5~Z@_#`Y4&OoD3MB6TL#_Oe1d{3SJ=}kImR1i<5=)W)i>!A1 zCV}MrK!tB5$RsiR|7jf3-(;3rM@szky?$7@)~O;A%=-TehjXID19WRox@?Z1Y@g67 zO{JL}f6c|!n;EJP%S^-LiKMFHBCs}}*4VkO8#>`y*d=dl(K93IxgCG7aSXwzb2_VUpvr^3d z#)pTh&zzn(Mp&t`2B_8+Q79==MbX}<{*iM|U?Cq3e#-A+XCMW6u!`AJ=JJ-%?j1Qo z=+P3iamqE;Idozg>GD1Peg<&YI=BDe;nH;AlHwZvs6D>Ec4!+kW}#0p2b@&LZeZEAB`O32Oo^dw zR1BpKP2~oYqB|ljz=sb*{*7F;37pidV#$F`PXL0;y(6;NC;e2RM&ba4ikoMJn&P@4 zrKmDX6Cf@xBgPH4Sw_3LIIzz!Hqe`rb00qcUlULUpyi{{f(qB=|5!mvx zBIFPMK~YDSS3|MKFz?JpM}oMjD=yDnA0zTpOI%WxaN5A7k7?M+kQ9140q!_Gt6ujCZE~g` zMt?h;Yo80xxvM+Y8>Db@wkp07Q3Gq>-pt1(*_;+2iW z-&&_(2wAnbA;rori4oJfLuB2HqC$?`j+o0P{`y<%@!0mYjN@~&;Sb!UPee7<2}G+P zLX~$z=HBOVLd1dG>EZV?rai$r{=@8wTy9L3186>?P?6nN&Iox<+?fxKh)#~9>8h&M z`vr|vkrI@~=o+=coO8-30k`71VWO-xj)K|6iL_7{#^WtByv$d9ZsFCLHj!TCMRUUG zhzmq6(HgXXW&Yt*WCJn$k0J$Re7dAFgutj%q{3Qe>ty^ zA;poC6d9%fI;2r52XbKB*GHORVh!4T*gbFGvfDj#>9Gf@t*FiK@M6_YSrW(<5f~|S zMGA{v^q5h@J*BL>5j zo(Mz1Q&Y?IhKo*nBK$eg%kiE(Mw#Z!x@Np{bb$NE_@>U(GX%z`CB)qm1PdKJnaqn; z;h$;}d|^FZljM(y1V;+Ny37<)ocmoyAB%&30n`bpRzXQ> zem0y_CwR)rW%FSo#JcG!Nax5iFTdDyMH`=R1?})Qu+2j#4$K>M@QD68AMWSlcX<#S zwy?)1?BJ1hqccF?gA7RH79CTFyKr!e9kEh-mij_x5)+<@b?(Xgug1fuh1%~ z*4?YSs`mcQ^DWah$aU6-gnkD$b$zweu3xuE?xjXrAI#4$oJU+!0(8xu#Q0B*dU>oRw3s1(vHcu_qw=)d^nJ1TCa)TpaaBE0+KNpv)c+o>n!iNmMTir;zYPg{2?*VQ*n~9;h0)GyEn`W~PcJuGHFcs3 zuRIS9FXB5!-Uf_b9u3&m*Vw?oEIu z%Y^j}YfAW=A`NtjBiiy&xjODE=4Qlyr~OlU9r0@;Z};cx_va3>UQP{Ifc^ioPZ=a=IgkbW- z9W6H4S1jSZn70Uy$vbak)%j%nV2OdY2a-4ZOvA!&(Qi=f&-eFS?taM~al-2ZC|&M! ze)Bg}Q@YIUr;~W^=`|e9k^jcW3|J;G_owu^-VFCAUPEpu$@p%ziQc{mk0c?pgq&;q z>2aCM87k`7&+5AK7Pz zM?CMmAf3@&tEJ`VX7`nKnk!3S z9GWOfr1ipZ;5xbAJtI-4(K~zl!t+-9`e&`qmgW60fhjBkxPDgfyxsu@j_!{};6Ww+ z%$pCpo&6^aE5E_GAuH@*@hdX$m2VnVejC)F$ExJZF&i)}b7?((59-RQ^~&y_F*|D>$0HZE<9b6*{ z{#zld5SeSC{H#;Y-)X?eKyiWPLKC~L8rnmO_KpH`UoA$kmk#uZ=4BmHB0Y9-+Sdmy zaEzO0ni}%{$sA2<-5ym}oW04gYSAqBW8S}KrNdiS*oJk+#| z>BwGB4-#o~7BFrsJxk)K9~?NEqN)TGRG?rH0pgY-oz(|Jy(W8*Oz)_ObpQ8aFLI-wF<+3T@+AKZ^IV zV~Z7d{aXSPbSdVM*UV8*nC2yyKGHyu{63kMm3V7>b%RiIl&I_V{GQrgQT!#1_Pc_i z=4{e~5Zv4rOhk`s54=cKE?x=y7paUTf3h_pPYpa?I&T2GdirIgDw*dubQ@mi$4}xN zsN?>~=Rnok!S-Vvqltcci-@vHo#W#S)h>CUXnc$f2^Sf%tjUeG89`{pHD_Y-H{Lh6 zjv^0`0hCkpM1NZfy(eK3Xq*01rGLx^S$ni-*M=Kx*&!Jzm_Gl=zY|pZFdBWi`#{Nl z-x^C04S+-ZR#t}20|#|jz8Y2$<>VxHJk^=V&-X-56yRm|ZB2HV-l zxV-ccxVPPF?;?1Ue0S6DSOROD7DabH-~qUgOKd2w{1-0;m#jI9JKOj@RYUY5(`p@; z=}y4XgLXReV<3?@!gDPiGTrK-S46i)B6X}0@c9q((uH^uu_uv+{j_Y-WoSneavS^P zh)TH$)?}2GSwq4)SMbzd@Zgg>pbp1=zbjPfKz87<7dmk~5`OBosl)Sdfz}~-3j+$m z+mrl-$e%!_vBFTcZjNIcL;|)<17l=mOd^MwzBciTrU7f*p6y(g=IU=&fuH? zqqOA_Y32jC`{gL`%b7T)SZdR^j2gW6hV@dZeM?BC@cgHm%6vSBsndF{wHV|i(UfUTP|$kC^Dm#yf93nN>Ibhu zZ^wxW8+AmL2sqFienPiG-XK*v>z+|4;dcRfvd3x&LlUx6a8l-(Fq?~}+Vv-Z;U+P13mR^YZ2EcnJrtY4Py*h?0*|=2`PXD$Eu8`GV^gTGoXhAK zU+e~PPw-+pCX4e^Q}OrIcy8h@Z#)V|26A7`Jtueb9PrAzmF*PeR9DnR>QE=>t8j=S zMb)|AO4}LwxEt(5V#v3BlFzt+bBU3mkIfOUF2NmqO|Qipvm1J~;RV^4-t)i?vg|qZ zJ;d0b8x;?T-ViGNbAP?g9kPQluibsgLCmZ!D^kDHNi315ly`Cp%dhaxY5K}|Gj$Dj zzl|f0IbJb!IsW7ZjdbPMcv<~Wt1e`k?DuEju~N*Dd}=N9Y)n{*Bin-qA|PEu;dTd0 zeQ*ZNr)@74e8`%$TYmI`XBS`e3GIYTnS?{t(YR-D67@mOAWq5joZj{i0e;Zxl zDvW9nbjMA+W)j)H!B*fK+cq;2b%D!RgyuS0Y=%l;_cCX?Pk8tGbyV$a`Ztzg>}xiZ zw~>5&47GxB7bJYH$aoll7>?m(C{A1{a5PJb+wXCKH$`&NWwH@{C?rrIPElJ*r=d^{r1L0)Xfzp+rj^wz$ z%d4xJ?un5~=!wj+c~6Vlq7~@j(zjt;@QJUVr8TRZ4iBeh&ubT$-R&btrV&Q#)P!4k z;^RUS{1=O6BD;)+$NdHKim&riVO$h?rxsP_Y z;wIVLstM)PtPsg>+pjP8T1wLbp{8oSg7H(r39BZ4J1xn;woIMCb zhEDoo;~Ch+2H(+Nh^A%4y#1xPsp(w7_0qFzAn!6eS^my996}H$7|2uRQClrz$@V2H ztkElw)U-5D-qo~o2=Qhlu8&LjtFVT$K+xu^UINdnrzvqU*{G-Dy{jE6ZMP%0l-Q2D zP5S6y-3j#QcJ4kKc6@o{-eBi`VNY?`D#Mh0df)gEcNI#CnD?{6LL-a0a>#7{)qee> zw433;2Y67i8O1X(EOzwtX?LTk6PlRm+kCUt%rCztDP|`5y+4QJMx_&%|zP+ihFxqobhUsOrdc01gzmS4B40ege~TrwqVaE8LQa4TIu zJEhCHTQ~!)BJ#}w&LVAaOq|}KPQTle`&wDK>v3X&LMx3Ng+lEY^+CxQiAZ^H*C%cq zl3zeJLW8(o4Jwpdkb-uCl0V@HOOZjqe6hg2^NK5W*4?(W`+ja*_p@XHLn>n$^yBOf zT-T&3?m3OV{?9b=BAnIfaGRslvc9ygC;RQIy4&qb@AKTB`F(hftE!pQI+7@F(T+WZ z249;~$f|^36y@)B8-Ky^o5OivU=Z;OT?_zd*Q?^;99masJzs{aadxKB*k4D&nKeci zgW2kM`1kC$=HTv@g)atve2hC}5Du|#7%lFiOV1RBoniKF9+h?*_p1Dng!~8-0-iU_ zTZwfowO4ue0^gY*YIm400QQ+MN0hf@TSOPl=@EI0o`){p{a+uGmvf9ITP=N9e z=T?bz1^nKiLajFGe342|>H6-eW>gfmtLtRBUW;i7tz`QsU}&V&e7~g2XO2;aSFr_} zdh3rd8p?d7JA1hCzKunLnA7NkC?SOFVKADBYvg@<^7O8QS}H1PbzHuBp*eTEk30Ksyg)3N8DY1rSoM;c89$wqjw14ac@gPXNQoEA zXDFR-1kK5!3kARCwB4>6fZ;y}4}9o+<$O^3kR6W;I?ePn)yV@I^{lD7x7(;5Ti9~) z`_~kBYcymca*SgAPR?O&m$@(EEFT9C2=k5wJZZk+W8*c;6xi;Zccvh^qNsb1DdT!X zsY#RxVPI9LCbA&zSuNdk{}DEDJt8!iu6ZggD%@R;z0Yx0L<9f``gro%k(=>%%2N@V z3V2U`72>VA!TrR`0U1cC)9`Db(fPjMY@K^bL|tceeIAUlhJIYBsiC^-%uMlKZg>yI zK+CPyg`6}>(w!0)RpgD?F`Zc{omNSM7O%xCH5L!8Y5^P8*3c(+MS7$W8hR&<4#|mR zS;&wIhc`dL)ny>=qHr^)2Yvgtl3Kc0=|gRat-Hu{H+Qi{Fl1;GV0`lICF4;wH z;)MrRZYv?HYq9U+r{FW-1BLIk4<(j@xvLh~f5;(V!^R@)!(J17F5K+O=BeMRBw*KC zRY>6n>y3nRyzVxfwuY#asOUsfcN?boI1yYlUhn)1b^1FnnWh0zkVLi&`Rs=f0Mf@f2sivs9x7vjBzqNBYM zB58+YSHKHw3PUmT7$B&vb0Xny*5a9C{-WrG?&j4eHs;65OZb}x-C`siC>RlY8 z_hD=u_{e!Uk@}=j`|rYp#|J1WhJ|KzxZYbvC4|Unjmn&LaxnLZN4sXiW2!x+e0?)R zh)2}rakUWBB8osk(>bN!c4BK}g=_7AL^#5x1ax{hhDo`DVf|uHj5^K#kytLlzx&5`C7?%` zMhnKEjAKZ8@$6VT_yn?vBn3x`3Aw8b^9%NOtG)Fa)RTm0L>uC*6lMzHaJ5d{H2)MP zE#P1JYM+)D^pAA0tvzgcCOz61O}1>^d(y3}?>o*VnfLnqA<>elUd%2NkF4&EE8F@U z=OyOZN`ys?aJRf%{~+$YoWBJkX?Nsi7aW(d#X#}nC)DnaX(2n{zO8J$8xCv|cRy4b z`SnxY7M;pIt|D8eINHiN=u=#NkpixG)c~i41SB_<9QW`9FwS*D?(o=2tdFfI2SS$L z?$@14nJhWW6(oi{MTT5PMVaWZhqlNJHj^f?&C%)`ccs5-c|!U%!9nY$9LrkK4%$b) z$Rd&-5BlPcuGG@>aTQJU=O2&7@<2FGA_cSTWQ;Hi=GN?Q$`-#`?pNht$I(XEDj;9J z0#)b73)JemOCYqu_`fn}1(6z;k4?VDJ1D!<9H7sCSr+QV`MhwCww!G;DErhFaQBdx zlwNDY5;+4e(Dx8e&hI=Lvvv(JROJ|C;DS~e5@85SHAq9vgP`U|&$~M#mmlA^SYra( z6c+0dPAc!lJJc=xQQ2q{rRo0F48WN)j=QvRcq(1pN6~w4ymOF7z6<3)Av89MQqV+&w|8ArIqmhMl(=k6GU!<>BfhL@QA>NZ zZ?T&H+F7b}_e`-HwSb#?t>!Vq6X&`{Efl0PG$siN$NR;vK9QArW61T~1c3a<70pPP zIyz*Oshqq1YkSeyG2Y%(_9)^Q8c@nQs5jc7YOxcV`0u=(c z(){GI@bZ07lzBm^1KG7fv%sW0XuQRfP-3+=USWm&s{0w51xk;bT9DF#{nwaKPw?R2 z*=Xu=u+yUDt83Me?9zIGen#(l%lk7ulnatH<&3t!gQR`iZZ7nyHYUXL{aKrgoI1Vj zNB8yaNvunfo69wn)^n5Ewc?4o!iefYQU$g_i=|eZUT1)Unzu9pAK+c`SoB_l0^y4H zg)_c&Kt9QwA;CBKscCa~t1wA;tfutI6T^^DrLeg{K=$~!xAwxV>@gujf*(QNYl_Xg zb)z57K}w5m-o-wey&+VBXRjEm_@YQ7P>GPEJy}`N7@2seIqP(@C3&(?V0N>mZDjE^Aw5XmgW( z$yPiHzzk}hsn_0xpEh8IdB+Ewl>K7~Q+@=33u8P#TZQVXRQVH? z1HYf$QBr+3nmwG4JMzz;OxRX&5p@f1YjvKCu|lSpGp2eG6m|5k&Rl99RfPDnzQo+4 z@F+tl08058YGt2AL#^x-IekrD3h$}VGOnGP#x+^Y7h#t4ZjQU&Zh-ei;7u5Ofo%Pv ztaYgJjW@6YdIHJ0hz~jJr(K=xgcvk?!Vm8$si^n%06$+#eYz&<)d@*XEL0Rr>eZ` z9n5eF9+lfFfLp%H49t%_l?diBCan7Vcl^uCDm5I7qK-nbvcepFPSsLI^Ep_bN~^|a zDDPBU_}4JQmj@{F03=;H(u-QgT-4tn2od_LB|;?!ENZiT zU_fy)^SN*<4i(um=f}$MD9G3Q>vg1>{P0~YJ^V~`nBAy`mDJk7=|iSN*1t&YZ|CB7 z&{pZcWJjt4v~4k7{YdC&oW~thohpZWR8SijZCkrp;M1F^f2kq&vB}ZvBxZFn<^=Rr zi;DQ&e4`uQZz)vFIW&(qUca$nQ=PD802I=zg5td=0`l_F*S`0a9SI?5+1keAh^~YP z2FSlBUu4>fIoW+l$BaPibB1UyxqNLtGKg5wLMc+#?*%mVA@e|+c} zf2n#0zyJ3^X@j8>VDr-b=~%UxsJl!1GOsu}s2SRu+HmbjkX2nnMbact+Ns}#uYcuWANruj0s_gS|zJ3 zL>i^Nutk*|Vbuwuo5r>1vM#|%W~21?Mzj-9`-)ik%Lpwge*qS9PMa=fD+Yiv{*NPN zFHrBd8wHuMhX6wPaC%naySPRj@MP1!jg#Z8AP8ho#rI4KTjAP|)^<~qqi^Y%Rg~$GR<}}438;g+ak`jM4VJy*Vo$y|v=WPt05&)|^qy(!R?OHxaxwK3#5F8i3bBef40?4Och@yas%k!4 zoTaFQUDbWAAM0m8ORnZV*Z%pU0F70&ssZjzuT?)mGVNyA|KTZ!Gb!24RKZ-^h{H}R zi`W>T-xW#hI2ub+?HeDhO~-_qQLsjc#5DDer;qG+=^*t$jj|Gd3BbomRR*DwU*BC=Hov@9@4%fvbnG zOwC(vor-GV*^_>;pL@d~c1kgp03nyoQ;>=o z^!7~#r%7*3f7)lP;};XT;rYs+I9-#tawV@EH{_7QH|QTu!z@aUU0Lr$5W?50({^W1 zuglik@s5eWi*P~oV|g7)GTc}NUS{EZiD~%vdxTR*(iw69(LlT4v+O|P@6hfy?~!eB zg0VQpCYS<1&P{loyvS2^+=VDJ}eGi~*9-U~vt zdFKE%aZo&{v&+86$g{mBDKTTy+mW1-puRE#Z5X~mutBC*bFW+G`3FM=PeB3_NAsx+ zi>BxJAIQPK))%r%g^z(eG)dN0B#1mTw{%`H=a8|0+TG95uM^e50lycqim;V?TUQyU zZW0sOE{4`cc5;hc>{yM{E~yzr=D_eVFuJ1F7?KVca+yuAp)f}|F2_aD+0OQ>e8y6E zGq6ge&<^f4Uvn*>@3DWO4J$XT46f>_Ew!Ay! z+eI?Xd@7_fJtU$L8vj#jYk)jcgDh_xtn^!dJMVN);vSp6_(a-WqZ`x-ad}ogvmrHK zzS8g+4J5FgVD|K+rU2WI$EM!+gJl7E##ROZCH^~Ynt~y8|B;ZzvnNle*exs8$mJN> zalrgNr78KBCRS0v&{S8Zw{}2GE}hm7!i*0l$&aE&9P(RA|7b_=js)oR+jvr5JE>@} zO)ND35uJNGGe2sJT8gD%G(xu8&&<1fTeqL!1w&W%gA^y&uO__YhgD=L zO3@jGoBMNZ@!LfQGYf64Jz@zs-uoK3qm_MfXWa8>Ot)upBV;jG`uq9jcBlHd=wYuv zJ@|fjR@~O(rTLh*`Sv5td^F4drM_f!neR4A;4t=+>h!!W3_;Tz-v882Jsg(8dpw%M zPkNU<20b?9kOxC~&&F#_RpQV}_k8S7*Pg^Q16D%hxbG;=+(}ueW|+w*05G-Y*E|^O zQIl;rblkI~W@c%!M6XFO0f46BV?=yqCt8flZg+Y?@6LBg&`u;IppV=1H_|?oVLbn9 zj%U%F`L~Lokt_mQ7mGf6LM{;q$Wrd!zIfq$b_H}*T6&T$A*?i6buVEX4u{UTGsgGB zU}hTV91SSllw^ryeVRB5M5ecBPF!BE9-*SS2gdDWA2xv#bLM7viaM+_Qr2fU~@t-Np{D>ZOojp zXzA!=DBnS} zs@9NCPs{T4MP33%JnrhoiXj2QKL*RX}K;uF*T&L}AN zX6#y<(s^(l{OnPfbE!DYFn6T;=V>5E6kiR$yTJcvD(DcBCO*F4*lJ-IVm83vRsLyF z4E%^f{GexfVjIX9KD?npLL&54RM{oF)x8DNv<39CS)SGnlYsJVY6OwC z*k;&RnQa<2Z03P*>l>Un_AWAJhmvYv2mu%fd{NH99mQWfg`|E7TgcrP4HhnDB!AOu zxp!z^&-#*8l0${|ze!TF>P!*3G~LP8TPT|8rfPEgaO2^@kiF^%pV2&wmpBaW;71EQ z{R^@NXgy!%%qb}A?kHXoci|A$t!hjrd)XCvwy;U1C6?`o#i#X*_lsN>YqG|>uefv* z2x&qEqNzKBNhO!zP;$+hVJ76${7rJ^=-VP3{cu;VLGwYrzF$)&=?BdV`IY!$SQ8cM z7k=KAmg^wi5YWg?cuGlao3NSWEsXasG2RpbF=8|?B=b15jZ@|c!h;$Qw;4+5e@eMW z6Id4Iu8|f4EQ}}B*fDFmyerN%ps)%`69)WNBz)Z49{TifjW{{Ko!#Q^rNw6YJGnRG zOPyre6x6e<&1Sn|AJMM-QkE~i7#g=9y@#5d55tTTG;i(^QeaV^6>M4$&@7VQARLVV z6mu6nUa5J{QsdLdgTk6FqMLniPOB=RyFT5JN zzxT3+EngMXIHsDaPWLx0h2~f(vBUcj(6hD|?n!*0hV-m6X-u)HtjbC=es2961J0!> z<`GdRnlT9;h!SZdEmp?O*H~vPj2!q4$fh5e*QmFdyt`)@=kYMjC$qvKKMYwiD2?>@ zbyh|-XNb9YgtGEX@*Jl`PndC#e4a@EIk&KR-dg}ZZ;$b^?rHwgGW*9L|6sPIslA-#<<_%>fEvFIWl$_?(+4(%Oy~J*E z1=hK!^v1NiPsg-7was9WO9QS8;@qs`D!2ba+b{U9>#l~Z07*_zj^%B7sbvU~ zAr}X1HP-CMT>)aUfRr@;w%V2VptTK^n(iPpIL)@M2u zbX9*TBjV7W{Q(ulT-(;6?9HmwET1>$$$8A6R9;NnbNZjR{X*W4T%Noahq%1*r_#F< zY?XPyfbi_ys!KYHj4}a=vx!lx^a&d8K zVEu7pK+q{!lgf65Y}VY~@oBaVAq)#fq2M!|`i#7#{c*5NBNx?vm1Yccw;wgi7&9vg*3R#wGiUtDAUkTeQ%xa1 zt56|T@s)%9N>l}8Ff+gu6N95*^%b4>UU5(&)&u_5->cGV#%#uPDhqMfJ)NGNw0Si< zENE}n6L|A=Bfgm%nj2#o-}ah=g`mfO)L7NO1r`>@|W4OycE0V z>g)5URJ00};#u9}Ck;7YqQsK&2PTKBIM)$^kSXHuHAO3QndrOL*_!rX$m zgvn{Z9L93;W-UiS#Gyq z%mb$|!>-9N59s0k7tg)#P)>M8H0Q?;Mq3;UVRn5nOp*13>CA}T@H5HcNObg)701}pO+{PcU&i^5%*C?W^IM(urA-(Z ze;8Su^vVl{km)Jkr%!l+{#B7VvG>1*=KeIE%t(W~G)DF5jBSMwnQY?@ z%|Qz=l{wZSv`ya~luCLLj7?Z`Ix0SE6MbigQ`;w4lm!Exo$|^r@!C@16EVvfiHR<_EvDuy1co^wXZyf6Lyk1oeCNiHT4AJ*@b zcEgLH(d^kK?h$=b6U0OB!!#r!fz9518WSIet4@J7ElxxV|Nd3IrvmdgHjbq%QK_N! zy$aH{DenP1D{K`Q(=ra0&QJWwPzOlX#&vHXFQAcs;A;TRfl0s)Bk^~g>tp*n?AZrzh(8os`c!QIEX@zE} z`?vjdAh=0#c%H}%QjWzoS)4SDrB=d}P{1&jbFXVPB~w#l|Q?Y1|*9$uQb=XV^4-y_`sX=c=FOAU^}2H zy?EJU(0j&%sM8fcTg0yH!jOgWDwVuSX$6D}Ts{0umsU-W-!*dL+n)cvPNbdQb^F0S zR7qflKk#uO9yEIb;uGf1Bvg4D;ATB)KhvmK8)^&NSEy@!dR3fhGR%)i%@-X}4|OnS z%}3h91;M7|8rY2{QLK&IJx-Yvzc`L#e7mo*5H9|0WW2Qjz*Cd z=NN^f`uast!E~pRG==;D-2l5vqb}X}!c^N>2?6S1$O4WJaDtSek6&sd8L!xw2yY2( z9QoSbIj-^H*>VZe_i6hyOYWbkUPXbas$+nG)By!dB;L>2>bIcOLCj~r726MW5794H zB}**(@=lC2<0L=tlenuP0Ro-o4A-dR4D#P&)g;^1MB{!3YVs{qZ$im1a;4sw7DPwA zCA^9EBs{AF-DWL69avLc2rgOJt%u7!H~%1e2<_N^xv}sazQ=hmSSLwQD$qi+Z+aDN z4e4C)7l>}Sq(`;e%?Q(TBJC*VF9_e3$E0Otx;AVWX}agUrBp;q{}nQv=f8Ke`2`OxHMenF3*7@v)1b}(nAv_uz9 zuwi|BR^B`yY33V)9d^UegX$xGr{-s+vue;yHN5le`Mv4tpOR(%mVBM8ei&Y!b=T0# z7VO3kWUfZLOk_(ar^oQrC956z^176rSlriT?xsYi!YoR=LUvr?u@<4~l0;E_qO`Ga zLI|$=d`$NWr_2IAjf&NEvPAE*%R-$#?d|xLpg}5l<{W)=_aDct z%MUQJ zX|s#lRJe;)9zf|6?Xk8-s(*XlO%O9@-i6ws`2P8#K?M3Vr|295`6B9?p2bL$1vUb= z>(GQncw4*AWVDzJ11H%IQ}=IaYluxPysK^I_oj4W+GD~+S+OXipnFh?ju(bBD9jOH=*8C)f?CKWPjTZ1tMD~;fL7={B`nxP1y45j`qda z$s<0Q^EpOY^su0Ar0^u!z}ye%Ic13pyg1IQu~YU?;@EGf!+{R>n;qK+?LVpY^x-%? z12!)B5OQ7|Vja_{#=^zSuHp3ZkCGmM`0lGKHBpq#kTL#dCVd2N*HEA=Phrcv9ZEeO zBdmqOe#v*U3p59HpFHKE`DzQEh@s|ih#aS}53`7{&^}Io1ES1qwINm#) zuov$W_fBahPMN!?rb_g}S9FFws2KveI@VQ=chWGo zC^0^WTj0K>g`9l%EHO@5h%Ctv_E%~Qv&+4B6bO5H%fa&F=MP_mGxUNZ3*Z4W7KcS9 z_{o#NE-%5JPC@3NvEAi@!W3l$!!sJb7e9R4G)?pK1H@jeFy@y^!kp zJtw)DWZP^VF|#h$Tq^4byE9-T?XFVc(Jr#V->efQEQ+d&WHqn?c7HF7iG!)zkQZdo z-04kDxiAWor>4k#zDk27Nk52Me7@f8{tm)pq}*zxC!R%jg8eq^jB7xk*kRDv=kvC` zh9-pMrt~cMA<^E2g)0qNs%k!J>3-MIXJ#G0*x4+=D16mHae`{=9vVo6;!x8MrIbML<3h|HEI9rJ*r173rSH&lJAN2uI(P z9R_~c#GO5s`cWd@TajQjHh`+E<+nyfUCw9Rz9r$LfJxGPT55=j2WqFjrCS$FFMNpb+RhuF5D2VT`~RLrNs$O zEp@3VZ&fNiE#+)L+`6Eoh}KLN{)4-zxmqGN(zqKF$G&MhwM~X*4L(GikA!y8g;{43 zcJFl*)^E-7Jd#T}r~BEo(DfE@5^r8;v8cd5%cOr zK4T@nBKR%Wquva|_GAMGQxMeVIcL-gO@iv|eFa>+W+c=s*-P*iIQKqsrJT3NYGce| zc;+6Xb!vQ9GPAIjd$Op)v31{)>+<=;D2dO2`Q0yInKW>!X^2Ct!D{-d?raTjCEklW z>vA+(>xYBJL62(W<9To%auR23mr%U)qn;J*l7P1(ad3{QdB*mE6XM$Peh2z{&(so< zx&c5mPxGr3*I=^=121M(k*q`dpUfpr7j<%Tk=;FSm)Mr%J&2$K>%C@D$eY17eyum5 z!k@1v!R55Vwjy~H(XHH)CwhY8uNaB`#P|4Geu{DcLC^- zy}sTCyl?K_+6=If%jXkOiz>OTvAfc0E!s!sH}G(YIB0}x^$i>>n&2gS!rA}=Uhg|g zM{)y{k3mz{w5EErHA`8NVr_o+#34dYm*;m&S2KG@2WlooRdOKg22k6PZnz3@G zyP&*rMg*@h&h_$@memIcg9#`!%SQU-Ek+ifkFL{r@tG(y*TDs)h zZCz6a;`S$Il!avA2C$6#f#KSoecCtq^v&@{g*74x_v!m2WVp85cirRT2=7pT(@Qgd z4l#7iBGzPTkb`llW@zYg`xR{hy!n&v#RsweqeC@n^^^?~3Ou%v-s0`pBS$({o z%w1x`S>qA5ns?WU{1N|~j5;aGK$wH`la3zy=i=LqRzbG{MFSRcnxy70!(tnSkqXp^ zVUlS(>;L|?(_Nfz7kjgujvq6#Su}~ri?lN1*G<;n&$W;R^f$C|r&MURW&6}SN1Sq0 zX!}ZqmKCYHpOmR_$OC@?5x3=}Mc`;-bYMrNA9ApnNfntLl}kd)BlGz~k2gya92`fF zL{bSy3|9DF_*Z@TPhs&e^rA%7f^9w8+9&w9C_dkDV<&ND|GB@~53nLaNYj5ufDQAulAWTJjCxM+qPlBNPK*3<*lp4{+ zT(e?CB$D8s0mFnRU5ShJtWLg{m4m$a_y;hoDKND36GE&$QsnPZT3+3vYi>m8(r?Doc;4}iFG%pmKau>2E#UNm=m&SEo# zD8>tmd!%f44^U3e4`zKXm_C>ORXu}`3l~c&QGy+oY`0eu(FB!l5YO3TM^e(C$CeJ2 z$jNT8z-6FYWJ$4UNL64fcjsc>&=)}V>GQM(RwV!ptQ2`chS|BSG3;YESw>@SmXX>- zf0}E$GHVKlh|`0TMZ<$k3@qouSyPT`w~r$srQXDi0H}Om(tCg7#E9tYxt}t0Qz$)P0BvBAD zh&>d&ylUB%<^IuOls~CN+SkQ#s(oboMRu4RQ$Zc?ewn1@2b4Y^2CYl!rV_s!xO>u6U{ za6Sg;loVLGjuO|#h6FQpv@83X=mkRQl}uCH^Pgda;%#$w>YT3$g4Et8IY3LiyM-Xx z8daC#5G(!S7|n&Ls_jTlJJ3l!zK1MO-P!pb4rdeQGOs(;~taR($YZ$rEf@;uH_42+$FRb};?^jc!`lyKM zkM@nEIV2NKI5)=|Z;%wpTHwdq;iTN&9%%@2^^$E%q>^youW#F6m{p5A1b8lBLJN4E zFw!@YttjV0+ZeU^O@ea+lOQqNAisx@M%fvpN4DQn)*SmJC5(BbM6)*3TV*HZYy1pzP z@B+4shUd=O6*8&)4)-=A%Ya-&EOR#=pqQ?Zn_d0wq&_|arX24_&CsVVJnXmb{{nG9 zj=y+~2>j7O4vJw^jEAT61`=mg`nS5tgVK@7&k*(zBT@8?29+{WB5j4XQG;@{e-iS- zRlL}>jZJF4XywPTsmB+t&z@#&W1Rx&gHdjm0<=iTHh4iaQdWQx1EFT{v(vEBGXSd! z&V!sE$%6Q~NjT{?2+vEe-AL{m~Xcs-r3HcH4pj( z=6nKkK7l!(z?}c%z?^k7l~8^_f5?gSPF?)v?N6VNUcc6bDryDU3nT8Zm58>YOi5L$ zR7N%+Dw~|&h6*gCa#erv)4RIjSoY~iRjOVGY0X?Vg@*xYuBkc#Ko(KAsx;j~nj(bd zAtakyNi*O}M3w8d28k0kvldf5jT1H!Rd7aU@OOhjVnTCa1dJWmU0lHrfBc^WgYORl zFLwff_5v?=LVA94c)1f&w0n5D6TGt-Uam4d@oLuz>e)QM$g?HPjzW7jlTpt0CQyUI zdp1*}lk)MDIAJ`S34kgIgvrT*5|i;@pPnortJ6c)J7IRRSd_DK&Kq6&w|K?t1nR_l z0$ik8JwC@Wu#?Yg%LD(6e=OuuDufPkEnPZ3FK~xS0kII}e09isZ5+ljBW$MnUa!O3YszjB>+FTXErn?5v9u1hTB!Q}ifA|oDp?A$ZXm+C8 zn&nGaEHm}F2JF0b2l1HoYC4Uq(K(oN%??!h-Xcx|(LoB@x!po|o`7XXms(lNEU0AO z{7j+&<>0F&#+ZU5KJaOyjy8K4o)&3AE3`GFgjf#~d z9U2w*6rmL=4B0v~e@gKALVcv`ID<~BQn5Z=XH41Ey@_79#tC(Tbz7+T4g ziCH;khLWP;gnC757iYMtgQanLa(1apM6ac5fSJJ+wtQo`i?&gmcuy-(UDJ9*qQ94-(Cuzbrr?cWE0_FmG&au z&FTcZU7r&eT5|IVOQ%V&$e4K`Iz1hwwUW{lF{pHSSF;8b?TAs6z-o))H)hunJHP>u&98Edn}%)_?|zgS1b zJa{Wfyq7TuZqIn+oH>kaLfKV}-%%0B#M@K-LlHO?DcGl_pA5?D7@BPy0==!up;<@8 zh((bFe^XxEC`d2-IaA9n?~c5cvEDl6%~YD$pn?q+MMo|OTY-)7E=G*1R$vv2=TG|WTAOuZ z-^5;=edAq>=mXf5Cq?p1e65yb+T@~{%_vSz!<1EYNvYLMt+;+>?6|p$vOWPXrKy(x ze`p|E^%b$vt=o=J2uCHv=oOT~e|jO6?=`Ha+A2mbi;!GFj-#(`;Y#xwN}>lTZmxlg zdKdG5H|${1g~-Mfr9MTJ)nM#h0ZG*>kpE~PUp0%d(XM;R5E$Ai;YJg#u)Lad{m%yC z^Ik7D@{49Llm%ei7EuoiG%dt6;r|E{3tYf9C zOZsAHl3v5r%Qz&YSQ)jLi)1S6g<<7V4OjSdSUzjYC3kLUjW;95PI*FvVLPoKb6_k( zk8RpaFCb%?zyAs{_Q}zWmR(B7)J)e+Wh(pl9i$YRhV8kEOwG(4l#waLOlzHCe|92z zDI`-fUniAhYQ}Hn>$DGxadwtr?Bc}A-_X@$$|pxHCo@JhH&!Pno#5qqGUaj*GNg^C z1YKYq{!|>jM$^VdCeAZnL$<5XBCw)UP7YyMSAj*Zgfn(7mfm40oH430dgrxp#^}oE z@JAKH5w`}4;nZKBn#pOMJH_Otf4cy*81D#yG*VN~Hide|&SlW?m3qcb`8$MRT?Gln z=R9^!#__iJU5xpYqT*4uz{N%$^!)UqINE0OMfRw`rXp2DW|Sms5&BaGzeph3*|OU5 zrg6fFUc|B$a+!__IFI0dc2BRNxS!oClUJ~`MY`LXQ`s&!?L=TCm-d4Te;;d9m+NZx z3gD7n@UK}~;)-5b?syBxsl;P*Zc2A6G-sW-uCU^uy=j%cJvL{abhuJXY(p6kP%|yYWYW_bJdK=pNYnS@8A8=BFM)^G z5S!c#CHTAAl`^*vi+QWne_09E+CjLIoO1*gL1R}6gP1obU$}V5)0L2&BBZR=C?0Wh%7r6AdBjZ-f1@o45+T^9U8=*t zYI30lNoRt6xurT@r)Cz~kTf$EW0w}8HZ`|Wij>*WwbN4-B2!amwLuuWQ0S(Ly8Ujq zDx+RAEXo5;dA_0wrgJUvUSXvm5&@oXe?23T>j{ZjB0LFk#nUOzLR7uHul`oq<)=CQ zqG=`eBJ}o&dVcenb0r$ze3Cov<6u_NOlz;)x;6rKnozI5GMnh^tqR7a#f#gVSkc2V zn{y&MJZ2JJVC9%A7LoP2Pdjq5r6!L2#sCg$>4HGzQxNoKf4lq#`>+`EYUO-|$(_64 znw!%YtPMgQ13$i~1g#``|2oQ4u_y*Lle;u+x!+Xtsh!~TMa)`a8qK?f81CGMAdYW2+7AIQZEGcr;oOOV(xJ<{} z=HY41ROmsYf0`2wI@72Va|QwF(95c{IQS}Lm~i+La~eX+!*A&VnV8cGx@UliIe(x- z20(e&tD082Qc3{@in5)cvI25tyC`P_5Th9rGp@fgNj)(m@7qf1i5WzXQMcmEic6|e zBM1t2f`Y&|T*@YIob?=0aCX8uI-$)8!xGFUefOj@f3Xxk5!TvXkopH zQ}>59XV#0AG;u;~*WNvGX2so8SsawR=M3|9xO+|hX!|*0gc0Q&`)L4yLU6C#J?&0k z2{MyzAPU-@-$1{bgF}vTPn?k7El$q~0!|o~V6{|lp*p+b9_Hytl$%I}dYf)yb9Baj znmyYyf9(+9_F*w1gc81=pupS!^kZ3C4W4JQxOrYI@>T?{`g!#u_+a`3hwT1FA^wRo za9dJ^5Ajc&;M*4AE24=OoDE3=JA=L}5;!Ym4i3aW%8BBe-v1@=)2dmOq*W3+kc1vK zB$V6tu4lW+2`Ww)79*NScN~ZFE+V0RMp;pJf0st_#=Nr$@>~y=Q7SwEFr^ zV4Me=zX5%#0txt>K$>$i2(lD%#+6%*h;=bk*b_1_xLzO`8?Q{<5$RQ9!YqbLCdQ!D zf39y-=6SvjDV9Jk<-ec~l^~-~Z6OFU$_aShkp5%vg`s*exTemU=4k<8Af?ZmXu!T5 zTcyyN2%zM?Akt_}Q(}EpO_^z?u5GPyVC=(UpNaHzTGQ-UiBywPyOuUZ;vRGlgA(^R z<=2|##Nt0G?93Pz@Oj^axE3bkwW#nvW#mEQMZ)`u_PxB_g?-6v@HDWj*pZk(;d$D(ataay}u(`C+{dO z+!1}-idFF;1@V`H$liQ9~VFsmn2i^G}{K>Cy>q;f1GX{eq4d` zIV^nPPrm^E+tg`ZQbgz_-||su92C=-T9#%oEy>!bLAMxu_4fUnqf5Mr7t zPm_zRrPCzZa8e5A_DU6Je=ka%&pw2t6U0xg6!gky2^oPGEUOjrd!{xGPFTLRskl|n z{Q2lY{D&}U+enOg*DzAjz!+1huhUVXyYWiX3F%iugyK%7qr>S)*bjNMxM{OZSt4Jb*t}7FMvMc za_RCrIbv0PPJv8nf5WB#cUyn5wGB?2AA()fXS5EED9@<)2WlGL2KOw|P$cPR`3=yL z1y`wF#A1-InXZLcY%-owL`}v@*P>{hpS>ICfg^fv26d$wt+cpTX7v875N=iL1VZ?* zAxpuL;zrJ5KoG=`t`5x>Oz*zL0E69HyChD znzub&*{248mublu-`$a7*f+~C3+Da;Xvx2pVfT6hChJX+%%DS8m%66tGXBD%;Gf*Y z&D2)|*r%aadavSpLYNVW?(Y7TM|@6A#rKeZSG-^GM4GXQXd;ETCZ|QYl=6RbLJ66v zPM}7#!C{6Ze>N>xpn&{@y-V0l@Rgt?HL;Ie9IU zx~1eSe?(seCc0iK!eAp?Ci&OVEUst^Zo+7nQs%miV3`?RN3c|bbb>MJXC>L!Mzl^N zts`5ByB36FbdEV!4!SYh)*w<>Ru*s+hGGrrpk$sls>^lF)2;%vbySi*tF)udD|Zzw z@FZ}!ift`GqV`&hu(yN@?^I(Ny)`J=ON*+ok66vc9HRE?}YZmkLoIO z8(dlD-Eenxtd(hvK(On69m>)YzAHcApOP&`R+935lU+V?PnU3s;fZ#Zkz1O8RhLCg zX0&xyX8~956*3R*+_|vY*IK7w8D6v|FHPke+_V(GG8&EY^J`2FG|^7zN+x5wkpGv@ ze?0QT@Qt5M@6@-vZKWAj=`M7a{2)B|^r9)^-?@G?{-xwpA{sxciwJWNUkzY2(CB5X z+W3HkRV$zne{hhRDQmQ~KsWhXy9jBSUj1$ntz#{rwOjc$AA`R%GM3yx^QXb_>$6QS z6-NfO9fBwjPyr7R4BRHkVs8#NaS<|4e}fv(v^uGsChxjoTo=tyiFD=MSugmEleO(V zX&ls55$tR!@m)D1!j`#8?`lgcKBXUO3Q7V)BU09?X_R$T7unlj0>Q8iCJ=0E*#w%9ETB>++y4%5 z{jo7aqU9+X2gSqn3y`QzicHu)mO;W)uZo5gdPDn|ZZP@1r3|!1RT=jkfg&w7yeQOy z=N<$|)HGpz6+z>S2v}%|r<9ule?J`p(vE>t8%psw;ndOeJ0Z=DutE7Mfd3{;wi5^3 zDEr!Q6RDPo3&Of2Z}BIIfvmeyF*4<86G$UtJ9|TalR@zqw5jP9w6!YC8|)&d8lL9n zf!&~;?r75zb2-3G%``bZ{OTW+W>djMLRB8&YX*`HZ(8~w8F1=^O~)_VfAv{KVIL<* zxpH`S05~n}GM-cf%5w#Ay3W%G$f=naM0Df#g`B!q$)#LK*T_YwbLlt0oT5tXR?U2Y z>a2f^8jXEa&D~yLuB}j-jWAbZf+hj*+N!>VHG9=S-wM{roXkmB00~57U4TM{*)pyT zKcN9-o#6Utrbkuh6}Gz@Iw1I-HSi@ac|}wk%6xFDbl?5z@6K;mz1i zlGW;ds4E!jmZximySF*r3RoOZPb*^-4_t5BUNV=V3LF!-jFgk)&SeGsy)A>0TPoWa zEQjyoX(4q;wJ}$He;Pr}j?#Imn^Yw$Pmv_OJ5Q7!O%EHb3Q-R_3iW z$0OhzdjW{Pz=YgD84D(Jth-{FvTft=#@2w=nY-y0ZXF)un{8rP&iXnQAhtY(*#Bm= z{oT0QJw|*^r{xYlZG75*7L4V#i(==X-y*bHgpU*OubAN4dZX#Jw}(jgm+Nhamzv3O z6{Yy&e|*^s68@!&M06mwA)f)>B9(lGeNsY0>9qdPnGAodoX$T&CIfm<1i%-aDnQQQ zT$@n!w8qayN=zWl)V9V5Id`*f)IO$ezL5sGr$W(zNFk({k&_qN;^J+_AU%~~-c42X zZfa0dtD>V^wtZJcH|Hq)9#zrl)%z<1(5j+$e^jWSSeCqPnSPf<5wmP?5s`Qs!bRv& zYB)G0CzOjgfba~mM{myfFU?W_stXXhcnizcav)f9sQwi{J}~ zf0^+2ETc5Ijieij-EzJ5X`=~nI$5W`ZGM$`RM$5?>FPK?<5zu{T%vvN^Lrz9RQoIQ z#2NM7a)7p)uN`&q*EB>dyyF34EQUoCuaGnL=D~p_4N$R)F8T;xGFnWg=C<{ zJ;fD2c4wVODjBuvEOLE^*Jtj@0`>aLylP~l5v9*W{qF+4UgEp%lo+Z${YvJiprlC> z8Fm8`-{=}UT^9`#q4c*?|ZyFVi zf~--5U4quF8c`R&Ue$`)O=s7PNKASId7Y_9J6U+ZBH?K8XhoFLEFD*~f8y*Cr*7Av zNKCnVUB|q8Lp8Tzg>lhp)lM%7q`snGbFv7CS`z$x?U7n(bfL*PTOTE&;iBCB~bg562Ymrqfv`ZAr>eWU1lGa|i} zuCEZ?jlMVI&%4+6W@tG=-&d}kfw3rSM+;=ax>52NKRil^;)i#2e zh!Cx>R;>qtR%!B$o9IErk~{W|o2YS*2&2b#2X3Qm1AQ7Toa4?I?ndXhY1y=3uWD&n zB)6BDuRH&^6B^v2N8OIL zQaz%|jNR$T@ot;)!HOEZpc?ODg1A*ZsrN@|N{w))>dLWGf9gd=St<&&y3}V>rH`aC z$4*HYPC8Q)*^Sm5J2$){su$;`RV#YaviTG~a211;)wM6_YaF)E*W}nK*P&i{iWbUi zs#7GyP!y+I1Bh>?INf?b5EZ9Was*y+>Jw?BHr>)IsA|)>2SinE%C_^R!dhh(>`-C4 zcad0En35KPe{6E^2eGCu<-RCoDF~peO7~6>T2+eKwW5^gQl^WhB;DIQG$~0*UPmg@ zIWL2#M39{xit<0}+fF(A9^aNuc@%_Udwp9vXFAx`W9Hwk`dTmfw+O1pJ)z;7Xh!#p z2Fk|w^Q4rA(MB)2rzcSKqH}gaRWEXe$}9Q|3cl-5eZ84eOGe z(o1ZNe@a_WnceIARW0fTw_O#pksp+wYLN4mmf#p^1|=2&9I8{oC)JNptpbF2 z7ux_;9|pP3S9CNc9-5?wQ+kAxD7P$-P|;Mbkpf(q8lR;`cL$F4k*Ma35Jb=t!;Vl*+NzYPc`fkwwm*HeB(`*Ny2~PEs_`x z9uMQi;X?@sUKGZ&QX-~;-Ngeq&5^dw*u)$=b4Ml{%f^)6LJi$Y?R1flnx8gam02tG zf6}{n8P32j!-DLN$!=zo=ST8CL-o(^<$t_b|NL0~r>=etvH)6l2Zn~$s{^Z?)IAjN z@4KKGet0xYo+7x+A-aa-1a4ZSS+bl$M?5fC{i+bdODuC(t|>)=8>s%g0$cYk@A7;I zFBIPy91Xqihu-m~?y9ZDE0t72VkTa~f0|==4vgKL3W1lp=4jowO?oiL^qOe6X-sp7 zKProAH&fKD&MgZs^qz0QQPIYQU9 zP&UWu8pPpyRTPa2W(MwJUj-+0=B{X(;K_<$c{VSev~ME*@a@^FhS+r+hs@_|e>dE% zj)WquH@oscRAdmBlYR&l;g6ss{J;KX`RVtyKRxC@B{VumOI7@hGzS*Ddt#%d+MnOv zvm^;-){=nsxzGYkv8CombzJgA@5Nw*lX#Dm5e^}wIJf)rHU-&TQ0H5;6G84SrrmG} z#p*W43cJsaGY1GeV_S3ZuW1=Oe>+@sa~T&+8MkKd{Ad>PcO7&rN%0hr1el0JDmE&S zQZ_qjt)R)xd9_I87mL77wASc&b}|S4x??9&6^n{DMx1HoJ4!%Qa$Gm%=Lj23l3D6- zg%PTi-5Q}I@ncH6ZnOv^96U;1;fF`tV|4Y0Z$GZopN?n6@{7T@>n5&Me+}1hBchuJ z-!>f2B<3)kZ4QU=>!LvA=+6Ny`jc0#Xjo*gc7FSoFA9oV7~;P9)5#R5vNd?(GNk& z?feb+-@up0tU8r!aFThnsQPw~Oj%4;P&)TfnmV4`xe5ux4L^X@GrT837MCQf7_m&M)IA?AR2qiS6Kg2J%zqs2H~tmb&OvMF}LR!*z2~(y*WR)7rEk8 z*RZbkf^}f0)a**c+V|e6P<2!ZW$_2f7ke!QD*;Zq+gsibOF!}Xzgc?d%~<9KA*Uo^ zo+3+xEJcfJE*OU%pF5mM6F`1UIHfo-v!NHv=gZ8$e-7<=Km2gVoU06(>`uAgH8mfs zyWk>ZDlv6+2DRlG#>VmtE)oX60N0uo{P}S<T3f;tG$cTB0HI8o!}(nX_{%B!^{jV$V1 zORzexxl~QsqEL;^*mWvLh<_HjR-mDnFo-IF-swF{l-`lhn`^TLfwyB2sv`eAk`nAP_km&h9@=r-)4$G=+f4F+}hPFFF3c8W}!E5jFf!yKhrsjL8 zSEbgIucN-=6*918sd*&gJJCw(bi8>$%U2SU-xzXA+UY=Az)KJltavKvY6?}PP|Uqp z>(4_t2TVaPF)Ldu-%OYlQ^iZn>Kl735N5{I_YyP1rGn{?noG*rG@*0JLwh|gn>cr> ze|LxsDxXVRmw+@!g?e?P&pRePBh>HV+22azbGJlJZlC01_zmgQb-XsQe>-q zh;*@vi*^wYu;16BbD2POZo)+4XC?~zHk5e;Iq4XjYN%&RG6T#Zs!k;1K`W=UZPaJZ zuRUco3mwf5L$*_+oW?UuJyLZVL~G!gf2$3GKaOX;_=BFg8WQR_LhipMWIu1gG zP@ z-B57b7^5v?{UvAxf7E2&}Q$+XYK}e+csC z^`vX}*Gw$Jy%XGcb20GLmkk;?-C4%wi>#slgn8yJTsqdlk@kVX-N7%QsO{Zw`^?i5 ztc6m{ezc6_Mgu!=(x{Ita~pfCuza~aSudt+ZbFX`mc~)d-Q$t>(&imDH+`?aml}(I z9cOnchdA}_{Cg&1v#ECc*;S$C- z60-^sziXB~Fvi~p53we;wnK_}o7}~h{a#uJM;a$Z9>4|PX60{H!C8SilV8`}Q7b9f zK3S#tQ21Os1=to@F0fqtY~6IevJT%W@NFHHV8)cs=}+1ty9`70sWjxb^nl0DE!3W#0JiqJV;rn>if zUz7G}mc-F*kMiEV13W?AJ2!G~O!=@ru$-H@x61UePmhsMv;+@3*vP5hJ4J(7ro*^h zY9)_l{I;UUGAt&bLrLJ+e-qD415DDrYrAJn+)x${jXy9pPKiJ2(=}@5!&o#F25IG@ zu@8%Bj<;@o<|!H47_CppsG);k?TF_`IS)gb8}R*2JjdcH0@WHnd5*Gyx;#rB?fJKK zUnfymj)R$~EdQKBDJFbvBvAOQO_YfrP>vVdtZI!U*`3%xlI)vIe;^4XBaI|!Y`K9b z^&<*dSkbvgmWYxYXlj6@*eUAI_3hS1o-nMdV5OUX?hW3R{TD1T2K_Tdo#Z=Oa`7^#1$H}B?EM{uxe;kepYCyvtT*#V>3~(L(7TelL;=791=cvE_|>iAp1w; zI{$v@K@rL1MJn)7lK7AHnJHsaVAJJF5%P}528KRuvx|y0YGJMy`hto{Jc^x_xSq>UK`8#4q0Vl7F!}PUS zP-GG4uFD=6am3_)| zOeI}Me>M=5KgiQRK5e`TA_&&OkI*uOQ0{qk6#_>8Y2(H7{k<12cAw`INF;_dBvKd{Hp=Qo?b85zsG$;+Yl-R`sP{oOjc z>|8+cAxV5EpesLZ+#~^uX8h5-Su?v$IMdxoe`X&1o+VK*W!~SHHYWVu#DqWaos2Ho z^p1A4t^7}AHhlSV@_h3A;KdpnUdweoE?e^<$uDK(!`CsOYrH-0f+d_E<2dqu@RJ#f zQeepE+v67`h9vo}$_zP$mzaOMWWtftl0oq`uj?7~_|8wlILny#HVp1rki<4dJvK4w ze_xm%W;8A()YZ0e>E2|#J9)9U#-&rexb|F1@uRJC>3HlNLHnE7`}ZK$0`vJk=g;wY zdv~A4pOoNcnLi^I+}>Ts%Y@33q}r2qmOSzAgPHd_K&kCFezd&tr`!(VpQIgetAY#_ zejM-ajVCWAYy1d>wfNfFb0Y@hV&}&Ff4yhxvNBiW&wwkr8sDRFB?kUt;>sI;9)yoH zj-*vzuyf>Da^pwd*>&RI1#^^qB2D-5ua1@;fn*QpZCTzK5YA-Dcg^m z_86d*4Kd2%H@silT*3kw@3W-OySxqXqdHd>tN2$8L4d;5Qu-#z-C{0cVL7BS1=4GF zbX_iRRw1U=LAh^Acr=%@u+ReDe?6VVm6p6t-l4${McNsx<*j!F{IyDmmIDLz?x$_MV{_1i|4fe5TVXQ93C<5pIL;{FUpOqnQu26n@914~m*v#&}^ur?<`AG7d_I=)C4) z6~71)O2?)1fpInxQirxMe^N^a(xOQ19B}X>0Cv+a zBK;(a;!G4v8NvNN=F8;E!>P#Y@x3gyG;9est07xaq0YKci~e}}$m2}*2>zUl^# zNJL*b;dR=eudKFBFCxzgveQrv!#uFlt7yynt5gl!GPWE(diVTzREddS|IA1Hq8!S< z)fSa7)8N+lrnaDjd0-c-NrI}@Eb7_}dT!_M8m4OnYql=J)t^#*P^)eQGU@Bh*~P`# z`4698ot?fu`K()wf4_SB{>{;)cIC*<`LiA#7 znIR~qU8#0&ko!?zY}NY0Kt=uVL05D{&bT&usb3uQ;~U^HjO%Mxj~ds}96!8sQl@EX z4OM5YeCb@j&@^d7ZB^@}&SJ?lsY}-u^R&(dd@9qzOIZ3Be@lYi-oYhz3pn<0fjs>2 z_O7AHOsmR=R@XyEl@HB>BPt&r^A}W>ET^IsodRC3X;KBh1_!oqSgYz&x^*1hUT{YQ z5NrnLsQ#Zzk97Pj=+M2=?rXa{_;dM*p65AlmQ~%*Tm4Xxh`hO~H@;;Af0eAVY%h^k zZR4`~ODcJIf3qS*zd?L|l@66hyjc;f>*VGcznd$<&>s1>auGK2ze>z#8)mdGP{@IN&F(FE>=SoZyv@9uf9*j8)}ecOk9GngutsDMAOdcZ z-E-*<2AQ2u^`G~Szt&yJ^){%oI6l^2ycybf+nyIjzklzn@1Wt6fcu0Yp9E8 zCIKT-%KA%ASt{jw!!LQQE7wi~Mz~a@cR_?|pfVDjm7bK{rA!HITGG|4u z7ewTZe=^8qkZ}B~`n({hXbsgskyXQ+aSKfpnarJns%qykGG(aNh$XdD5F-03Xbetm zaXzD_a_%=${v*IQRa>|jhhvU$lPVJ#aX4V54>lW+IA$W+mr%0~-Kv6`byVj*)dY2l zXeLsqQ=u}~q9DFx5AD*3WqoL+W0@ynN!p>lf1-%xXYu;hxm$@x*cs;s<(Btn)oR8V zKnDvKs#r4b0siu%M_ChnDjY^W-=NgH58}{=%?l#2S=GHHY>e}3lVFHAwJ<3eBFgN@ z;y1to0LdC`dbK--w@jQHpa^Nd;s-5W_j124Te?8)RAL06Kzmo^t^mUxy7(ZB;@`b@ ze~LDr^6d~6(jX9AIYr7AU`$B72zKg|f*%#z@}y+@y1i=cQ)69m;$q2+B-7o}0AkKv zb3Yr@MMH-o8EPcnMqqthh|;R6^#x91m^?~l&TFE0q&j_SsOf8TcJjw*%Z6-`BjJ#b$3aq8?laSDWW_5!6f z_g`sz;c)g^dF42Iw`{KmbE_7Yz(R)t0Z(3DH`xY0j`BT1V zC7ALjab6^s#6IL&D^2W^(~FW;c0x%p3;YRLTEH|q3WNa5yIBh%cDCZqsAL1@f2T&N zBG_*;Z%f-47cMpUOIpe|OS73jx`4BEs&SQYWzSM~QqI!8rjJWRlBYt>RhF(~o%-Hu zcF)2JkC9}arRz->EL9=C8^LF3rqjovkwmPNeC35p>G#UuI$bN2P&rFVMbm!ahL+wq zHE)Mv;58v*l%O{=)g>?7Ef5SD(!M`?eU2lY-ktV~@em?ylH7-D@=RJaDpjkSkQeK*nHYs|(s;Vapyh9hM}oBVpj&d560D7*QyNe}Pz^6b7f| zxOh>aNS+2|wY_AV;M(i}i&cZ|t;GSh`dpXd;7F&6b|(-pqLsjsr~;=#Am}wJk)RO~ zx&aO8(9l&(n+{DA*^yvCHR++80;;Hy5DaRCQZyV@@hauQVftJstL`N<QDRslrMa-v-m2*YNinKjJ5wT=GvE z%B#QteHB&_MAUXld}*q;)3WoCc~DGU1DSamC$}RgaL9LUxd<|re~kP^Fgi+8mdKI| zzWDM~G&`;B|FyS0Hsoob2{LT%=nempZ+xL%&dz^4dVO~C`Q7RJi?`>WPtGphy*~Q; z=?VYA$?4zl9au5FM-XIwIRE$aw?Cb8ZTRNR(fJ9UE=*Sv6J5afvUH9(MRk~$0@>1Z znC*Ht)l$Q6Wia(ae^m)^boA!$b(#Y5w+&E{HuvYb=+nJED5462sBsg-qqDb8g-Fbc zz*K(`6GnVSkZYr(>6CBj34_w4%>)30JtNnAF%s~Oi)X@uTZX_bqax&S!o_+}zJfP=7 zYONoTlh@9Lic)DQMT~d;e^wdv1jD*zBRN!iN1F(7^7Yja@qu%~yM*1;SZT6!s$u=zl(A~4BxPSY zS$L`nl_QBL&Nu&}xp1Y05^_zeG9~#*km+!8`PI^)rf$3vRtm`SGB?>JJE)HE1Pc0j z?z+ggN;|$)UqNjNa+q{IPu{utk1lFbsqs{LE_f#&f8MgulhvofI3_Op9!9F?QuLs=FEm())lU&ZzJ&^l|&5;x}EaxQVBxk_kw=};|mOSR_VLp76;wYlSZ9>sf7%ArMy4$H5)&8}5~WOI+3t|Bsi9s9 zfflDuI8DK%|G&L&?P?=Q+Wfx1qSo^TyFs?(`|O8p%%z(d13m`NWncGl3aK!f7Lr~` z*v-uGf8V@SsV)&&5s_Jf-qW19U;$Z?S&@;E5%D~M3?0OXiaBazewiP&Q^vOYWFnce ze>uy3%Z9hB>|#9qs`KjZ{(or74lXSCvwHvbnm*ex8sPKcl(-b+US)~al%Kcb;nnrc z?Aw25--fA=-4k6WjvcnSg4z;PMcYo0Oo!m?CUewy`%l0_hxVUr_}X8mq@MYBsXide^y2>TV)NcwjU>NTNOH}IZmO_jpu3f??v$Q(70f|sq(#q!qNC)b#L3QiwOaR zZ@fvQH0)8yJTrdX#=Iypj|`;S&M&lC`lDH)%o6*Jx!`1unTApwrsK)&B2#`+A;IBd zc9Y*6nlY{Iq*~F*j_{C3YwGv4vcugwJbHg{ar)ux;^5=Q(~m{ro1OK$=i6c$`(0SqCUqjZuCP9 z@sHaRpQg*(xz6Kcqtkh|Fm0j8o<1xs=K@=}K{g+j`a#aC*Ko2w=zYx+n1RgqFd;qf*VLk5LT^#?WbKo+S1LnJo?Hm%CLa`oHQo zuf~fT{eu+W0+^FcXQO$N>?G6KI!Clj(nV(d{HgV|hnEYhKx`@Kyfaz~y#iNRHo8oQ zza}@yOD>D>RxkIO7e{sf({4iU7S>{*kM|I^5bb3CF#k=;oT^BlIf zU=kcp2Fe(B@YYrY1LwEv+gr|7U)3?3j2>MCE=bsB>?-O}T(|3vG}v}hjT#DW;V=yj zB44GiZJ7-hQXO}D9BQAftT|Hov zw7#W`88?TZK8?-q=s$PLUpk(Kv&F(oU5d|vZYVcry%9ParuoL_%&m_p+3#Aagkis1 z{BlH87Qr_3W~!o9#n1iox}^LfRD|S)>wP0*hr&RRVPiB1z~br%S4@a;sGq=b%>yzE zhF`il^FXJn@tX%^&g82*>fV2KVIUA;`8Rj3fv8VFWFinzqg>FDu|sd@$gnZ4=%@iA zK~NYbLjNe+r1LT6Dv@r-&{P+j_ihez7Qk^Im_yFvJCq$A(~O zoA0o3j;V7%u z^@k56a+B%xf#i~Ql%s#Ak+TECtCBN`47&*pWa29qUde>(dw3}m1euT2U>d=~b2?1x zbhx#a7FeSW#`$cjekJd!bgdL)qBVbZrB2J-hL&Ju-}58u^3IHt0~U&r(5nbealz<7 zEf|~=B%P;=^d`w_w=s1TUS@6c7Dz@9lopazce?G0<-X5Pik0q2*1 z;3FFa`ZPJ3nwOy9BNzkM*;JRi;3FJIProX6e>}n+U-aFwI#8SaSw<$NU$gS99-we2 zFW>mFU6&+=ng~3bIUO!EVj!yPJot=ODXCV^sJ14ux z2fm+w`1$nYAY@MB9y#!w4vu$^-undJ-QWLzcyM-B{EC3>myCzfU#|OXenW8oEH|Mj zbMI^^i5~Z~8|!*)U+T|2Y#AO!=NuU2TnaJcB9V#J0K6iG<}7mL&()VheZgB{gMx}Hv{>gwOW?>pkMIlpmTD+r}ce(546w)(_l+~ zO$5Xy7#u4E2L1nlADSpUePeVcU9k1U#v~Klw(W^++qUyeY~zVJaVAclm=kAW+qRvX z_q*$Ue|nwnsyco8&*^n)SM5FZyt5!S9~Ox|3PI2VLhRA#L(u$&VN?r&+h@p^)6vas z7?0!jtLgBW>z^&`!q~neCra|aXtlpXMC#*nr3|qepWAkc_k**_54x99pEV#DF(O9G zgi+K;eGCH}jmLi;ne&|^PiGEoGS^Uj>+QmT09CXG>Ne!SyON;*1tzSbv4hu zsi6SgT*lALb^k1epR(>)M6uyA;2#0NSqaVGHix|PkpFsi2lPq@M4Xv%YtD8b8}^-8 zaw}hb=*CL4k&h@ssjx{DLrji!5DE$cr4=5M$u-mWc(cm54jA9Z_H3G^?nF;~J&oM} zPbvv|2hBFdRz_dN0sl0Ux}appu}2~wr!RY;KB1HX@zmE_yS6#-vo~xnE;GU9YnPlX(*x=ecJ! z=AB*o2DG+JNiidvC&06--Dwf++R6cL^ihnz%E57?aW)`@c33;j#zUp|9k(NCzUV1F zFuhhx$-z+r#Kgq;?i?Zhc3a<5v^|`}QQei)aRSDqXi~lTobPZjnU_{f(2T#(Cpt4P zXb%2--ioQ{RrnGK65(G3wuYOX<%=i}l`L+o39-yN= z^TXiZ^SvFd_C$KPepmLX7?Tr^L}*#A>HOc!&qIBiTU;M`$HB2;%yq_-cn5o+Cl{~* z&Tu20O1&$6ADzw#`OEwFQ-&2Lb9+Y3#T=0CfQ$sNzrUV5N(lgWyitD%?N0d}rQ#un z%ZQ5PCz7fKP8E0ctSq~9&BG0|pxs9#cwkR$Sa=hf<-h##W@Xr@KqBq#HwP>2&M~>Z z>v@U7`0;T&{oK18zTO#pU+DMIA(J$jhxGy|`LI&}e48gq@`X?$=bu))9U_|eqBBlj zz7qyyO`=58cTUG3qTxXJ@{tsUk&n7dE5<$j8ud-mFamRM7rohIZ}r3CQ)5IM5CW*# zXspW5>M}wI1qOpE3_m$GdR4oc%$0H5cI+!NKYJpzlz1q-RBxY9R+u&_LJzCVV7QLG z>eZvMmWf*72mbtg5+&wc?ROaO{ic6{Q;+X^|i=E;BF@1cLw zM_Yko-dYgshh3oleN$ac^ePJ zpWxaH6-=Ab^j2p7j*_>~hiGW+t(}CihDJVe5u28!noovH%$5chVyTgUvjaD+R*Ti& zgfcn1!wUNE-{<*ldH9ZRd_4GYG7?r&T}plOi0o~(I}t)7Mz@2nbI*sL5_LoX!Av|I zSnS;N^VyNyPs8W1^jbe#5q9l($CDhR-KxRZ!tCa=XPEVm3sMRM}^?EW0C1! zHC`%tBWC$?MU=z7P;rxS#{Oz(=0>Kh*E<#7W$KV`{kQirT5DXrKrP6hw5uoJQ zP0mw3%mBYos&-zC$<%Ozn@E-l5V?${cWC)Out+)_vC}`uT*zIYX)Mka@VVngsic{~ zj#YZ$53AMfoVdilf@DZdg)&gBB{%A*rv`1`j4@wqku2K}WPnUuoB-hUe{4YL=^8v4Tg|pfG3Kw&KRZSz{pGu%wX2CNRvL z1CN=7UZLJMQ6f_|Ehls{BV$=Mt~tgLUHxrA&M_^&doly~epE%$ z8Z@oTT*mZo)fg!})^-sVuzt(f_p(TPbErr8;COC0ZwcN+{NRHGEAkC)iFT`ROB|c_ z?ZS+<0&S$733A(0-r#~CLaO2j3AYyE(;;J=qZw_+m)U41RlSCUNVUm{rJO2kD@|?? z*z9G(Yz@zDG?Z5GV3yy?pOytBl4*u;7}cDl@EtJvfZ@U(0`bx?QS)i@UI zgcnP=U01`@e=VGZRYdL_>qFQ2s7K#vpEH@H()H?|{MA9BjTAy*rg7PO@>s3E$8but zrZw5)rxpMsSo$qbkSe9!0&103K=X3wGnv8Sa>krf1#^-RPD8E{{oUp5vg)1v7dfT7 z4JzVTU1^+wi-BR7t#`;g-Vwql80Ox5@p@s2-iW5@b=zEcrT(vFr<-*^clrrH;C0`5 zj3iKsXcQ(GaSSD_g{;1tz}OSXBexSQBnpl5CnY{Er$#QS_S9wA9Ce^mz-JOl5eGv4 z+??_ye6fY$a5i(W|j~?+lV7LNk-?r6m5`JY;B%k z6Ov7LN%E?lwzz|R;sL8R4NRnvv4RgFWJ*kws8>JpJqsQeUxn@tZOaT&|vo1+aw503T}G%$8qPzr%iHCX7;Rs}i58yD-he zhcAPD;ZA1r3uix|k{oxhs;khU9EnPrA$n8JSdfeLO=XxH8aZ)5)?(k@agob(bT*9A zXhzqJnm=u=uOBuh(bEYyweYgOJuL@Vh4NjeYDI>P!rR8hOP$JI+{EM#X1p-tS%Vvr z(pS}vQS--yAO)48kBwtABpo5pp!5={+npjtOVfvLFSQA;3)lL(oNw_t>sv`uIp9@B zyGro6C2G@i1*dpN{3d|)Q>`X=`|Aj^B64y(PLyhjMYocOh5mOMMMLO7_`L_f(&0j2 z>~3|TASpUqb5%BOGn~Yf6A)QKj1OW{5;3ZBiSYRAqS4= zAh|TPouN-J7h=!RkV-OCLX*HX6D9~WJylw4yEfKM7&GLBlO3(IX?i);Bb36_g{rV+ zeV946<0ULX*OfJuO8zLSVR-=5ICnAY9T0;j5cM=MV7!iF!uXhGT7@Tm?aF*%p`3|i z=$B2=dP+jSOboSeU~`&ZX4=-iOFvoFYnCwxKmXg8U<8G5Lt-s%ND1@A;xTAiGCHj@ zmEOmS@Z^Y50oD4Df@Cv&t@Eo^>QE6zPoCEp%TA-$6K>k$4G~irS~S4@@qnWjWcYx? zjv)5czqiK@(`K*1&s!TZ(^dQo>TgO(OxT3rh@(v6!6kbM#A6$EZL#McZcd4+%ojO? zM0Ag@J6CtR*B7lI>1W$AX`XKSe~W`nA20G4;p-6xV&Pi0bh}>jZUtPlB@l481Bic2 z=%O&^45kC}IMl{+K`!U9<;k&ztzkg(OEOACfAFhV$Huf7Eso^_An=k*9!wFq|78G= z=>{TQkx>E?6)3}Z?M#FnW$&Z0WF_OtDiVL(lRBXezXg31fQQaqHr2Z}!yjm%YxN)u zmiv`^LCh;;^J|D?989!mbe*W^d$2|S&gJv)m<%>Xb8ktgI^So%6xa3G#b`7en1MKZ zeB;1ss?vrjIAK-Kisl3u*vk)LaWSVGV3n@q#WLwB80B{`Dl}wR+4mCr|G8S7qpqvoe;6sm$|pU`fMLSiH=^?Gb%-{5mLbuBs`6TI7COVM z^+G85x0pO|XWLzrh|z`vnowy7h%&$~-78P1M)xhW}QJfeHL_{5Ux);*tx5&eSN=E8hH&_8V>c(3ohBs>FxrV(1_ zcLr=Q@$Deff2H&l-#=y#5Ds1LS9WLeXx))^Z}_!!E}%SJ>=W_S8+1QwCPFNx@@DF7 z`a5w0bk8;?sKOeK`$^kzKhqdMJr6w$AUftX#R|#2ZV5`-Vx`Qqg|?$x@rSGe4hmm% zL;D~^pY)Y<@5nn!@|2ivNlJs_DLhq6swuog)3K?n8I~W0j^bd)+&-oU6w_Jx$gM}d zX6h5E_a&XStS`e;5w2M$YIc`#mDhvzSJwyg(f5s|O#gLZb!}tz<&Q+XXu(s*+c6xIaX*|!7 z<4T-7jR|^by?fJ@jQs9P=J)6W)H0Lm&k}yP2EUo|^X|sdQd3yul{;ZMSom; zqR!dPCOO+gVr49x>s8)@dkWcN*1ZS-L)$qZJ`q{R)<7^ba9$nsn~$=Q)=O{EIZn@e zVM0@HU&QBJ@al>7k7Ui3JL@yQ%eiwPYcE7Qvi07Jst1>;?UcYE2Y8UVROyx#3DR#( zW|ERb+f?q~fsL={!hdM%Vq2V%eyd*fqu3G4N9@vIqAgrNY z2|LfXjOhOqGk>y^ey;}J!L>(fT$F*c@Y2j1H4-TFITlIbZU2(*gPZ55t_U(EfL;?g zd!_#KUb|%u4}nvUM>9k2)!)|8RV|ZpNcgYvO#wIL+g*o(F~67>RVYay-a_uZzj~p- zBldK{rgX4y@YCsDA$0KN?_R530QQS&R}DNnHKLpsz*B{=LW#MnF@)?*ffnLbLZfoj zU){+b76Nu-H|NJ7+)uTtDI>|PuOX&`R{Q9qdZ5b)ag=ik-J62U1^L>H1O}-fNdW>> zzltqq2P)y@lUYeLbeJXQBE5gPsTDUN6Hw+p2pjiE-+O)H&9gZj=jac>Xa_$YC=IT> zUr4E>Xo{`!`_NHbC!}^XSrBn1I@BC360+!Sj}#08m^c>q!u-Mn508nNuD%>RJigsK z(fxZ3oEkwmFGl1?`kj$zfSFds2u7wG>vF*CZxlL+Fx*vg zXwAxFq@zxsk=OZ_CVZF%aZ~z#n}uzN9ns*^K=3d;G6pvEl1tfKOz7T^!0&#&t63p+ z5Y3?TGm4GP!f(G|1LUaMrn5<*k0#d3fKmUtsdp4{Kw#tZ4QqGuN@fo-+fD|Y@j^j6(%Mj zV+El_%D4gXBdCQt9a}%%oTrVQor`LMndk7JP-X)|gOnW~tqY8L*2F+ctZVu}Oj<-q z$y%inJX3n~d1V*@nt+Mut~>sVUdY%)^*BBH=@Vg&?*)DZ#!hSgnbg>tk5lp~h}nz9 zkx}cQ8skDagk3F4c<3dltS=iD;>;a?t?f>}Fn|oBJ=x$8#7`((t#1T7Oq)Pk|7SBM zF)8r6ja|ifiZ>|H#ec&zg9a@<&XL0ie|=CX69U`m(Wu@vIN>26YtjQr6!#5oHc~#n zQuwU8{S8hWzV^fT0X~tc=K{TIzF>XO@{3JQ9+RFG1(zDz(5%l?2@BDPd!wI4ms#Pm z7m&%IEhJL0j5druf0C?6|0`CM*i-G6$e~em1spAAA#t^P8c_q3f(?Q8ksw4L!)(`W zL#sRKiEVDx`%j+@;Mme5ve+UVD4rO+k=1Gv)&%ue-o?Qk5=}zEk#n^H@`__$ML^3iN8Pbp&#Oi zdaU}w9Wc%OVVui#owJ;uPN3;)O+N-|7^n2O9X+8Tgn#w4aI2(2_hUE*Gv~;A)@MDB z3JcC;jYZb{{pM@2Sa6L(gyIpu*(ub*%_Gpt&HdptVOfmxcMwbCt&DM8WbewWj0iws zi|w^}AiZFV3e244Ue`Z`VJOPiNt+8yV7_2_X7)X)!Q36w zm524rp13dLi>vDV&6A0`+m30GTU|Y`G&XQ`EYrDN`YF?0q6qxLWBgC*V-=|yn0B{S zZ8vfWV+QF!^@A@AjRtpjhBP=egMj3-H-~ET+2C_TOES~Mp*ED~ywA!o4`MmLTx7uf z6Cs(>B-|Vu_njY>>omxQ}GC}p~4qXouM+b4@w zj;DHcpn-0qpW1HquT3@XehV<#92u!gDW!tERq4QNA3>t^*GQ-eWlncIH2}!fCgq-N z5|>#5+{aMG>kms$sny|UAs8YvltX*#p(^EU0Uh{tWyOad?^*GV2B?;ZKa;?Gws7;m zczv@Yx4Qj^W&~cm9Tvrd^@X}j2l=8vEc;nnQ@Oa*UY$ATKf8y0Oy5_0 z4)&Y0*bFr26I*=c=vJ&^+@=&4xy2?|3@aOEF19lV_!DxE>dAjI7 zoK!~`y?BSrp>n%qy6+}tnSx-V?aiFqL@F+=>Y;8zN+7qCX%vbfjF9K2#vnW5UkZR% z$zs-(Tec)PYHip6^`iZck$JC71-)UiX)r8wuJKk+A)%SiXA-#U4QYRqry>kC#tm(So?OCmIU8pyDraj?MZ&qM1 zcJ^~!|4xFWLLG$`{3n*M4uswE;!bD8(SGks?ArtTmP9@Wyi>7L$}UFrF;bJ)o(Dnw zZt7fWzi&tVQk@ZwiKY#XWV$_*xq!eOR`G3Hsa*UTz??9ZpHn^535;w88v^OKKRLx+ zz;gOkec$SlEp-iuqRHv8j(Uo3p{Q@@QAfg-8d?(-!S|inQQ^_v4ZiOCOke7ce!7(c z3_@av?=>OO>(X!EtLG_Hep6^RjF>&h^XLFQ;SzzcX*yJ-aG_y%?6`qv3`BNm5uSpN|#5cZ6m zjr!$%#*Xj?cydMBu^X6^H9BBpl2nWax?0y{s*L;z>Wx)JO}3CCtGWo*4;4gBbSb&X9g_I1NtMj+Of8rVYo z5=!mXEQI~gl}mjZB+v%|qkdWws`I=CXcU(~{&3WTH$%qcVUDYG_DsKR{HINZs8gX+ zj`JBOX>WkFkOwf~grN>8r941_*u`vDN1DC4oiFIdrR80!T z%Z;ukb*15f2?`DSu2>bS5x_;6wILD;*cjZqY4I%Q7*jPm&VW8lp~VQn5D2>g^cUyp z7B`r*H>yK6<-f=M0;rJxR_g+nCpO%!#v0o5@VAGw{t$$dq;NfdA!koDT5=e(dHo$m zQR`S5&05IoS;a`jFhPLh4fpC%k4$~-->$Lv(&!2K*Ub%*@K$z6x8 zCFF2pzuvFdKXm6#qP{$PBBVfWtN6uP3p90%*8Um&TuVAgm#ACc^NhrV97fhNeS7ct z?1I!OmWM9MFImFFc$DBzsn~=Nq=XmNY{LYevU-Lwz*%4wU&I{Y-n%sqi# z>G!>8QIkdznlEDOE#%&l_4`A0+rLs18Kt=9fN6Za=UiwYc3Vl_CXeR^rNl=Bi`7<&wdebpK%liYvezv0^ zTSmXHrTa4@DlfZKuC4!_H639KM7@#vntL@J0veAUF-S7HW5hRfw4XjZR)}i%*9EmX3fXLn&u?=MUH8wk zec-Tu!G%&+#Fj){%;@T0QpunDp-G5{Uis}FfjZY<*%rGI!#U00DYhh^B^SPh9YJvo z65qp^5@`FK%Gp3@01$S9o%v`UujxMa0gW3``b}AW^}25t)&P^ag#wQf&jGGHPzy;RFX(5(U+V_ACanMk%xtBD4y_BGw~xWf z12c@YDk#!IOJU6HblLdrVQ<_fs9>qtiA5G%>`#95u^IKQkq_qtt;>??alMZKq=Z3! z6Ur^O4xqFj`f3pu*=Dn9{vRYkT9m?zzPs_(=S{aiv z?Ne=`*FT`P$mQ14EbALm4Gb6hXM6k=mP^%zw5u^eV(vYLa*kBV(W%SOR41z_4RtS- z1HF#@cGaFWpd0WZs4-c$^SHGjvtt~FC503@zQNd$7(CVTwz=8sb)XY~A5+upZtFfD zikA^-BjKV>?0fn}E3D2l6t6merd&PKvDxB%GQ66kGV#i~_sxe(*k-rY_Up59Ro7XS zejo#axn&9!=`x8QBiRRXU@+#i2W+0MRI}KVxX?ZUtHH;gE;?}=lyE*+DKL96*OqUe z+VtiS*{(B*}l=uwzcr6IH{ zxk~I0pnrm zCLl}{$|n-74s)O6R@T@)Up=$R)d9DRvUX}BB!uJ_<_G6zj=Sui#5E%I8O9#@UQD7V zy_r}n?Qfc#dJ+Ji?_gc@FQlV+ks95)Y%s}pN|)~U=G`+F-wnfzy1%c1^&#Mm_n5-LDV7i)hHSlO*PHObN&~%d{EAI?JOwMx=c#R6hd%m=%8x%MAUK0sa{y!Z{XV zo!NwseImnq=Ntcd$aGm?QOM!{cFFKv-!5VX|6^E0=ndcPdV>=PNLyOd8#mCmbB5+7 z?y_|BE|Z%6B3IOo)A+voTiiU-p)leTggWgOn>$g$cWf4rqmU}1W3_q4tN*({m3$RD zm-unmpCebfWY+lMH>zQLN?hq!iz+P3H80~yMsGom2n!h5t$A}>_+Rg=vY~dWJY>(u z2_b)e-sf`iD{&ASQO(Rh%JJ3T?`is!lL#~%c4onFt|FY51;B0?auP5+;5H07EdY>D za~{#!kzm&B?umQC%xTe=x7q1jf_xf!B!$@r@22HaejFwn|ZUeI6QvVh}mTVz)tU z2GIk0(we3n8~j-{LMQhS^$#^IMEZa%_VoCF<8uy~~EL^hos6ex-klqs3uIH8#p(mQ&6C(4yU zRgI%98Jm?gukR`WCZD}~wYIfPPqwpdt~B129^ZIWV^HGd(1x?m=fcr&#UhMui!@%c z)Kxq2fNM{y!tZ{6sefMg1L)68wX+L9e06}`YVxF&NO-WlX4(tft}RaW2aR9t@1F-6 zDka$W(KAHaRO-J^Z9?mU zp%#`;$$C_l?V(#JOz~kAkOhfX4W`jVAs#t471<7Pn6Go^Uh!eM3Ls~*q})iUwyUDh zO#`>Aig;_t`7kQ|3`;M+AwpV~YBed+Zz^Sb^Q&#M$G$;i8qhfRQFW-(Z|C0mBR{3> zggd!sn0nD2yXqdfR^xn0!oDX;v48dB<&Wes$5UT?8M%nxQhHl|IlbQc;>p>xcLS9d zn2Ftj6C>hj_@J7bKH#-kJ(hK9jogdoc^ySLOKKKFFC{-M{HSc4(m+QnyN^EknjNQP zOx_A{=$9t_Ui&gdHD_ofSV{>fvop_s4Aa*pNH-p$3Mt#2tSkW&T#1;2EV4YX!L|3K zpQX60vitw>CDmhor774V`q58Mm?`{Uty6EVB{ zHd8E2qu&*F%96Vi$LLns(=ublC4x=8;(~6+RMVF?#9|AkF46K0 zA26E(S1#!HXmQ)Fp(%RC((_HZ!u8ldilp?f@~`cpf|J*%W3`{%x7|CdIR|}Fj;}RA zGh<&LctHK#5%5~`1lCh;DN85Om-nS4^aXEnmg{)^ur=oKfYV1c|W>;y3F*A%5!_nbbRD$p<4)yF5)>8GtIKBORZd$0LGjM@cq(k`?G3)>Eqjb&5l6b zAhD@|7N9jRP-Tg@d%3Fxy+kXpzbtDSckb+)Ut83c@IcE+P^vn7T{juOw@Xan4!uKxHI&ziR!p9<< zc-7ta0ob`OrS%;706X1yvrgcJcRvI*`SE`)=&o7^%K4FxYK%hVY zE+L^6#{9ShEs7}c*D;>DYZdfz5r8tq!l5E{EqZC%^iyAg-NNG!Sd1lGZ3J^YRw?RJ z@cq-%37aFV+Xj|Tb^E^C&0R%l$WcAT@`OSFM}t#VOuRhHXh>2nYfCFR)(xTOcZyAULevhQY4-W87C~RGdOU8#h0%S2w`93jcCF51A1e zpeRImnR~klO@#9U$^0Ap84?t9fy6ru)dqCk(n-h$bdLzm5+HYj+tYDL2rpdIcGP~J# zoTE43H|CShdGGS2QPFKKy}r9kd5FOUfQRf!3NOK-ovlf(iGrDsMpzflWciO(gIOq?yE9CT-Cm86rr3mx^QoSOaBq5 z^r7$}qFn#!Qn~jdv(MS(=OMt12MjHKd`_H@AL8nAWA?(aq2#$tAWT~s z9Vx7P_+-{FbEudl9T_ZWgs(B64(iXR&IBnu7Ns@2kCoQ-vhnr ze%xRr49aBOZZnhYI$HIjIRPJvF1n2mQi{4EDAue$Nz5lVz&WFP=L(vAecSz<0yjRh zhiJMevB5D&($xlYyeORWXKhm)h81Ll4!d%eV^|XYdcT5WQ5X+Kf0YnT+%?ryo!9MRoit8^WcC2sN_-r99vOv;_0f$ck4@=<`!v9 z-L9(3<|cj#iP>eXAw2sjv8|NaErmx1zhPLKu4}k3q23~uKgHuu34!tqj45!E16;z{ zGD}N>KM)h)Zwq+u@{Oo5hJq`8JMcF8kgs9OPNw1bNyRgt$tl6HFoK}(bsjFB2G-*hJPnh08?h%@gZhq;JQ$& zw$2x1YPN*E8JE~&^rl>{P%$2t2xctERDnkZ9Xvu1;AxP8n6*$#XAY!|;|XN3%<)xT zxchrkXq3Gi49x#dP7HXN3`#P?1G&Fjl4ix?c1F>u(;Xo-2E1G16D>P_WZw*2m%dCs z4Zu8F&Ad#u(J3DZo&Nq=@L9D=8Y&34KX;(!ZZT~{J$E@#bJD+6S*vEaJeGuu`6bWL zWtfUrpp~nh2MOcL?GX|31AV2SHcaxVcDgN!cvp5M>f1zWH8J442iX}MhT*=3LSziO z{M*2aP*Zn@#PSB=Fcp=9Zjx-#ZnKSsihq~7=te{{4UX1AWH3D0Fky8tyx16TIWJwO z?+6R291E+IU->I%GTMK+WU%cXPgr4i)ihfa@_40hK3{VFT zl6w}n%9D}({O9S0&3$=v#k4(;f6ZZS6J zJCm#*=L&lF5v99j_$HlEzDQx$T;K-|*re%MCVLlZbEAua${~;wDCF((!p-BE@Q!I8 z_h>dFjc(n&^r!&snorLnJo;{Gj2ifUx<$Xp68_fq5~XVY*!9-5|L47Z=qmbhx=$yG zNSx@`>iaT-S8bwk~QB1pxdyXkDlbjRq_QK+?Y7ch9hz66oue#$3jE!}LoX*ue+ zsa4!t^AsBd1}6t^DkjCpRrBUhe$|6+8uo&2*K_qwu9K%(r-Og*mJ9Z+ZE9Wawg(Ia zFUl5MK-Z09W#cMECaCY+2xWaU+SdLrm3C`;qF?`cy)t#9?8UjX8t< zqW1!bQf(l0k$V^Uf;Ip3j#!*ayQKY@BRJn!&`VoJbFkv1x?3od)eH$* z5b6JZStGf40+Q3dQF2Du!x_Z|!=~l8knqqYfNB!8zNNE@cty^(cRxvzq=uY|h0p^K zR`2apsh95QO$T8fRo>YmEfuIptuCBh_1AyfDjZUwwj7x8g6()T1HC~&`9sP`*NGE2 z1PLrTbY475W>(lYS5`-nT7W_c^VaL(?~R(TT?i;Ky+I!Sl;t}s?#$WBb$sOCyFng& z9_c$f*m9%d`i?TPVRmm88stFfVh8AIV1<34#F;1R;2QY`_}CyXxP312z?mj(5|DT( zL9lml^Yp-(BZb(AY-dAxZ+kzk&?V>St%V=UX zom+p955tX8C7wYMNHEr7nN4v`8>ExRiiO?#927^!Kt+p}7eKwVp3I`D$ZHZ$RyW7+ zhk~gS)+>a$CZ-g3w3^ z3s*aH5=eP@RdjFS`le_HS^x}Isa#DO4Z)UnwKBzruff5k9jpSLWS$uV&=|d{0SdrH z$OxH+1W8C`Ywwu`EF%NPDT80ZgU40WVa9*0|4@e**Y-8)7cpyHuPKON$6VB2i(vnt znIs0hNr6I;?xtHn zDxxPq1N92VM2G|o+RU1=R$-*ZIFlSezxGP_YPhNs`Z@(n>y=3^fAnr&ls+Cd4c4@C zd5*Nx-@4oRmH3B$WR)nH!OFBNeHk1L1Od-3S2x8q_S7YEcM~<|Ci87oC0w3D0d;Gx z8-kTjNh~#7g3Gw_0Ba5wksILZfZY4crhEAIdX4st4c~KeSI6UPVbj@P+u%Tk5T9?G zF6^rbCx%(bofWYjGUv_D#5I$2&S1ChKil?dInE<8c;!FV!`5%+xdl0| z>Ai3(XCk_t&d`edG+LST)rMeuAgfqOKCa$gh`B&F#S}GQ8b3CSy!=(3`;&D`_Ppf% zCzj+Yg>go%O&-}jp(fZQgQ#3|ll!)fdXuHC(3*!N!or_Upz@AkSGL?;oqW_4>OsSE zUSsZ@#XAMOW?2(?Uj@>49`&O@I2>|c37a)&+EVu9CFg{w!?Ks zno&K(_eI5w|8Si;;DB#9yk`VzvGRCy`7ZNpbR6C5UHAnW>I58UcSy6jUYk zBdY8rH;#TTiel++LXK}QO0>N?5+F)Jb<7ftxbB}`kt;k!Us{TTrj|U#m%iFXmEz*P zR63F78E>IDLqd@|)n61=HT;J;A$DL|VlD9ZUD?jdC@CJW@K??@PswSBxFF)W=;!Et ze=wWNdoi@SjU)MlMw#nS7W*x1+Dhm zSL z`Kf}(_fQ5fGjezh1B13yvN**1c?q*0^vCV#`x3{?kl~Z4w)M(hYG&lUEPHq>hnIA}FLA!+4WCn-rWo ziwoZ8vfP`wrNS3=-ws_X=KsBr^C7!zXwftY%*&+Xu19TeAq>#;CeXL#_lW-U;Akk( zF)0F!M4WJz{#=rc_m3s#n!e@XINCyth?y$~8%Y>pM5gsdd_sg@Fz>U(WkhB_T-$~_ zf{z{j`cEqBC{%rj+%;5qDl$$flee9ZSL(+W0eD6%31FjWn@ z$pj4g$VhbI-|iBL%jHUHj2--aG)>v90rKo%e6F#e5ENesB_Ss~+)9TJ7~I z(`o7p@@;1ie}K~(XhpnVi~~0)|CrcH18uu%(cMR6^%VOTObcgg|DrvI9{`KwgLgAD zOY1yn7STs~F^<$+9HQQK`9tt+dGW&o{8H`IOZT$pu37UYO-D!|igpDEY5U?*^0)x` zF^23of?rG*Pfvb{jm$R6$PNdUeA`J*IUZ9|G^^wptV3K}$o5I{X&Gi|_)G$ytkGGU zVQ-$PCV(GYX;%bdKl`vM`vH(cI|yM|;^C2=WOs?%V1{m1QBY)htvXS`cVYBcFr5~Q z&^ep`hWg!12=4ZSD^Xb0Ro)q`-U0z4yK^uY<>tT^Zp~!&CQZPqKcF#>Ci{;xtPGj}mmgtF}X=>B*~7^+urI36VQAo928+2wZq#0Wrvf7+I^ zgukH&R`lJ)yVvpMN8wsJaLA_4L!hAqXx2P;O zd#7hHa?XlJv1?tZuMaTq#{+oFtLXxfte~hDeygx(bkayw4EC-55k^l;<<{m6(2OaN z`}o3|NAgF_*66VN1cg@AgUf(98#W|<(u36IN-vd~2RbB;F||7@S9^z&nq%Ta-;8*X~c&m|d1!?ZL?nv*?8mU1KFLj&Tjn%?V|cdbbh*|7;2TtKWvr z9Fx||Hu3SG2&|yyYpmHWa}B<0O;v@X>tanV}RpsqnqR7u5V%7MRBzB&Eo1nH=gaw>6AnC7HJ6rDnW`o^m} zXYL1{&m{p}Wtkq*lE>!Ei1;F<*>Y4N+IL*TE!w(nUl%uF^)E6*-U-Uk?TVw&4V#nk zgky=N*3{Dhr{;8vWM?0g3X;A|F@yewd3R|JGb#dP;~1wI0zd~q@xB+CGFgshOkY)d zqsxm88___@4XQfA^mG&?cRXrxn+c9J2gkl|!QU~_Wp&oSNH0etn%Txv{FR6jSf;QU z*!JR-pPy#6CuESJGe9(mZWL7$oSBLmSw9jShtYedQi6AfF(?-RWxo4xA*e>dE;i*M zD+qmvH(>~w0~!W^^xmZoGWj|kSG>+;IuW$Zcs7X&rH=&|#-%$tbOve@KUx(a3rv~2 z)AZ(^?yOz16&zD9-AV)Xmm@yQ5;XD@$^n8DhPMH^sf^z0h9lU#)7LPXto0l|t)ta5 z#|Q2@8hsJEZFOigNHaDrVmR?C_~)u9-9^fo_?s4^02c7n!p{ySl_;sl3b(cnnA8aO zKez^8C0ju4S}}22&OOVua&>wnKHwR5Y=wF$l_p!$8?Vi|=xP&w2FL*_Epg3y3jMdh z2bDFGn(EsAA0^q%8xTZ0d2J(tO)5e>9q$4)63zP535}{~*&#;~IVlk71w5(rvZY4k z9qs`aa2NknLqgo5NjG)X8MZUjw77NCw<^8+@5&IC50e`3D3Zf5rCjbFo@+4-5O^vb zbTh=i%)NZCs$7gmi9;5w_9f+0JOo%nG-tj2Z*Onf*cGLI`Pd073!oQEFq<0F33?+UXXqYl5;c6Owh9grfD4lNLr>-TGwqdxlBuV_LT0c3&`5g?7K@Pg0>7;Lf zx&^P5K@ij}o|gr_Q0bO@7_aVUg5)_JS1FvD<@Ewqp-n*gNB=e}QL5ue?_qA}z+T#@ z2cv2QR-(=gHKWg8Yq|iR`+zqgd?i^J*iKQdq>sLD-^!I?zA4Eqj!3k&-#i9C5) zmkdbcOoa-}SEND&4O5UO!ht7|1C9I9sDQN;6(Ug4mfN-p)~h0x2DLfR}c z&@f8ZKGr{=3E?)Y(9@wVp+3U1$OJ69SYNpKelWk9xJ&as6&K`;0ldQ7QAUqmcM36llZYXF{X%yYZ@uPU&U z`{mbayZlko#+H3bx>38c%Ibd;nRbEG&+8qVm0qEd19F}4wP@c&Lg zJ)x(zXU~BId*3Z;0}3r#^#Tl#2`z+$Qo$f*z9|n<7Z>g1i)bAdqs{pYz=9F{TI%uq z*TX$Xk5Qgu;hOGS1^{4s$-EwYf7?P%QPq$rO@bZKB@}JcfuqzM(2(=$3st8HT7mg7 zj&-iiNhdR`m(`>?oFBtAWq^fq3T7%`w1F4r7RypAEIOr3OnBshRuI63bUrHPf~2kaf-tB( zZWwdjE^YqG5k@}iUB)`?#3t9D7I&==6;2`Gwu!Fa&5Iw0h)_Q44s7PWpz9gH9>2V3 zl3GIRH!=}bm2PTwkbt1BX&K$t_G`)lY!=M?)h_9xe=!LPSoUD>9sPfpI>+ctqHbHq zwryJ-+qP}n>EMlR+qP|69otFAPCC3f-#O>r`?JQbU86=}&atc3GZ)rztmHhkRw*3T z6x@oorh-05o&zAHkKx(WsMOLUkcbdxpk(`IdWeNW~mr|A;{mH?vw;(gM7yCtABt+v-W?s=24OAciR98#R( zcGQt*;&nKNoR(Sy2kHD)C`9k6s=D!Moc3?h_1`4zTA^Lig|GaIwgFc1U}9aBzeLnU zeD`^ad+KlE(Mg=`WfQN^=hNP2UVTqs7OJvm@reh#75T+xgIuRM@^sqLY{!Wigd%s^ zwR_Mig6#lcJ1*8O>nyqi>cVrdhy&DLu#sXW#Tap%Iooq3om^=zv*V@RegeFkuBYsK z0gKlR;;Y#`lnC#*CR0GLwe=@^(Cnt>&4$9b;o|dTpzz|sST8m1O5(3K;2+CIG{eL>c1aeYN1<6BE z2;9(PLe92Q`Y24Z-~qER-i#YQ4HkTPFJN^_<_okRO52pjOXLjVT?>O%qge}(}1;|TvP<2=#i zWpw|mnM}HrU~RA+9p*eERHE;rfkI6sZp$05`Y$gGlNfs8FCcLiY&smL7CG|&iwnZf){N; zD_Tn{g|vIsAtcLO4^+z$o=qV*gqc;)X0GPi?0izxDxFS44d$>kNkbQ$mb(o93tlf*C(&e4grU(C*sKRmy>Em>T+2oROb zHQgx)y^u*hFUkUtO|NB=t)Lb87L8Vg|GtXEF;{GrTTx&CH$^Ed9yY!Pq^XJ&jzqy_ z6`*)r;>0Gr$BrZtgf40&9dH9`b74=o>MX{7Q%cJ_-@J|}YgSQfuJ!jk&SM;cglf~G z*WIigw?@X{(M7}W@)@X)%5N&T1^~r|e9*kNSjnz|OhFL?NhBa$+_Cqb#eeMnJV)ej0ITxYRuVo#L$2}PfGiCk0=SwQH6?uHKI|9MZ(UpMi@MXnm8`XTE_9^!}}K z`wBFP;&GEkX27f^n5;1Q?}2OQj1(dcYZnq&&Jq$smNmd6_0{OTDkk4Fs>zwsnr?Sn zEgYE7nb%qs=mUHsSi;$#=@~gIvC;C(m+>vuWkO_SWwD z$(~N(2p!(aYrk=SH}KyE3|)WnG;?Jr#dxgAPZlW}VY)`D*hNWo{cFZT@W|@9&(8@` zGHyyCY<|k6bzoooNxmh89NY4gIr0VhK0XI|KycSAP6ir~LNhj=HR$@@l?kn>~hEb$R->id4bBs{#E zsfx<-@$AZR>+9z3!ih65Q1F}dxbAAYJvn%y<-JXtP~!)xf8Wxms~bDKd@dAlfLxee z+-#~!JEXWfI(JWG!~nbt{FgWB#DiLV{dm(h+W+TG|FI@1V9GRH5em4pdXN8El>l%# zF!tX4z(*@;5;f7t^^Z6=!sz3!OtV`|9849=#oaR$QAv2L-Cx)`$z2jvXWo0Sr@s3A z)_f*%UHp6FMOA>t-OVdkSlx>$aQlG~WfV|4GHi{AHK&5 zIA8(fOb=!$PUk-04dCa*P*7SNCb8;%a@Uih)>B>xwj%s?cXsz4a0ITz1BLdXURpn6qGd~}&8k8m&h5&|>IvjU;9Pr%Z z8VIIP-DyQ9@1r5x=sJYvwbG+XOsk3wVf`pA35TP}#jfEVZ>N3vJPO*!CRiaXvMASK z(n4(fi*){)I2(k+nu#}~(9I;~iN%BV1~0(XlZ$7gjb-J0ORLD@v``vL?N`Lp&ZiKB}Yqn>q5FH6HCz#gckHT*5F`?0C-V)gtos(4)T zLb!NGfAx4hq;5NQ_`7-14}{uZR0QBdPh1CZ49GwJ&e%io?}Mn08_o&8Z8s8O?Tldc zNi4p_MXEN2KAiX6X&G*Mp8$L=Lw<|1H)ok7d*J$YpLlvjh=t#)AC~ZYg_LvD_Tm8Lp4`gi3%$-% zO<__p=JthEp`H-iF6x1*QpQ|mctY6B3|@d3_|2#USA>H9eTTjs z-*rT7&X&&p`1>pV^yMCC@q9FgkBiHx*NQ#RXc&0l0Tz%7a^OKic49;j0V|F>v?FuM zWqZV$H`9Q;z@0GchY}6ybwG#dQ?bAw{fh-Mii~*joldJ1+_|0qJ%F}$cxQ}wp)p(Y zj@)NlCEpchA9(lX=0<5u64Hqn(*GZ52kdbUSf4M)sQCFCEflw8=i zCVF;uagLBc%ZdPEoQIf8-uC5O`p&D!s_^&eYY~9Qmf`$h89lz{gCb(^=oYr2fbBZ# zvT*KcEe^V|`?O^G5^i{0OfTqfuxyfM=qj-#195rPky)HZ?A3pq=kh!ni3I9rIY?%Z>PEoZgK3#=^dsc7sa2IO55P z&A(I1bR*hmc=JWP=YY(UG~q)d=Am(D_elDp6vIY-vi=z;!4mDbR`dRi z8h2XWyM;N+X1f?sXJ<@C&6B_8_PMIh(;d#dK4q}d2`b*$XaeaTfo)UgRsR~1fODlg zE$?J<^W-XQMqv;-DI2Y7K4wlJy~TMGyqAp&J$o8YsfC=2w$I-3Zxdu<#$btKs{nBJ zpD}q{w61cw&)I#c886D>lPyW>4Z~e(>m^37t#cRB6f1)@cE)JCR zR^P``hOQ6cmV;mf|Iwv0Q%mWFGbS#jLBF9iu$$^XLs1X(eabBYyXgC}AApy|Qtyfl zLUG*3n=3PGrRJQQnwYkVv7H2fOrEavf z;=iK8jrVE`zq--5#JbR}@@AgqSRl#Jn(#RmXR=z_;5S26KdJ2fC8{Kc2gXPNh5ItUTfcG|y3i9D&zM+^UR;QWyem@AbdE%xz2 z&wY4gt`C*}rclQTAtM+nYw;f@j5~{e=N4n1&90vdwP-FB7L-uhI^@SRmxny)>S8WD zfoE@ZG4-5PFm3-OqEB5&E>I^?BV*8YL9ZDzC(g6*p;pURp`x7yOqLe!B@M2TGe*$f~1_r6-U)KpB~;_indfZ+NZhZ z10>U8@t7H78$8U40IiNS_w}PpCO(ZZ2ew&0t{{oB-qRJS#fTJu2>%waa^`*kxdWQ4(D6CpYJaFxlA&rSK;&ncL^d-A$W1m<3gZV#Kv--HVz(aM6-%! zS9bmxT%;%F8i^7&(S3p7!hO-Q%rt$8SxBi=Bh3~x0HY`#lv#B^gNdhf9fML&GleJ6 z2nSG93C|xeNjD5I$S;b&8mw6D8%(`2_Q111#Uof4fG#wqIoU>U79C(Bf2VxTcE&fE zPGR_NoaB&Ah{3{s<~N*v=|&y#N1O1BgbjiajLOm0NFM)_lc zsl@FN-%hQFmjKJ2-5Dhj$D{N_NT|Hbh-e=+3HW*%7Cv^E;`iQ)nEYM~J?J5-?p$C2 z2q)P6ZIejui{ZpcBPnS0p_b`)+SNk#>Heu2;;zgA;zH%XngT8?GVLjIFnBK47n&}0 z-L&^4Dn0LA06&xw!oEKP8it&kjB#2$>vNZZhiZ@>RbBvo?NS#GFbas{x{Kr-zdexy zRH%>o`9FOR^73HK`qb0 z^bGwyjFcr)DfVl(?eyk=efC3HT?)cAjRecjDWtU*Sd4wMR^k!cL_zC%B|EQ^)w+sR z(;yf6eXDe3F`w?)#Q&<%G;fSnqMX1)0(&>rXtDppS#=*dhrI^s&}6(9OGSGCfM1#S zEMu36oxti__q-YZy(p6Q)Xh%uff8sakOj1NPB#hvEzl-_sIDp>8!M_z-eN6Ih1bi+pI)f~Y)6D$L_}HW z<4!fBijG_|vz&kb^j|*mtAybU(d0u&*G)L!h&O7lO4)6P>NRE}jBfx7&J&=>EAwUl zR2u&w=E7KFUSSBk!D(`b>kPLYyy!@LiX&ye5-fHpq+*Th#)E*pal}01QI43=MZ=>r zijyJouij*61sNJ0u!0N$$S0<2${2ArM?*xP{bD|_xSb3#;JjjJbYiZ}s7~neh(~;V zm{e3&Nl5sLX57kQMM|sqWSBOidQ>9OK3~_LG9JwPS@Pv~9JNbWG2`$kx{^J|n)Z*I zbDqEK_kP2&l^~91R~=kEeMxunT90u#X(wMuHEQ4UY7*tjL2~2)F6!}l>0WxAou>x4 zrF{zv=lpSLs9w-MSKW~2Q)`t2PJ1OWrBZ$(Jlg7bC{z^=CZcpO5!5YIM8(Mm8sW-etGZLb#g}etT~?6w7{VSy`uSJesgE zwr>`PTDa?TMBiZo@{RKMx%!)BgaTeSu8MuwSd{RjWaKp+E^)xau>WSKNZD0jN-+Mb zUYivQ`(?0@m1xvVsQ}h%+VUEyF9PvVr&b1lz$oF| zcvfl2(uU|f7V-HPK0&ytR?KA|9vRY-&a*FX(rc{#TMv`yEp0TCD0!QPR^mDOX34hN zK3``_qH)Uyu&E{a!h30AwK*kZ??2v7E zC*xd~Pv)r^FA>)2v$wsQ$v(Sn*^AxVU~2pYs>7d?-GrmznQ?g=-s^O`0by#E?!U)c z;YaMJ#HWaMNMyl00Rc>;9udA45Bp5B{3D(a%P>a)gm8eQNo4V;ZI*F7(a(|Ls2!0| z7h;1B6ju}RpgQU#qSwF|FBSFSHQ7YZ(n{_eFrBef_n?@uhpTfy9)@rxu3G5^y}8a?s?Yy;g}CnOTWQ>zg*n<2ZBJ zAmqSMvOrwOS>a2|k?<%D&4$hHkT&~0&!pX?Zw;81fmkjeM$Bc^y*H~lGV{VgRyO;H zKWkRJ@g}!!Si8ijM)}Kv6`(Cdz9pZHSE~?UkyG6pA`f!% zbD9q6upw0NXq{7C6pW4gAe$Zdm)+8{jLmB$duVWJvQLoeyOPCw($>2na51r|xg)aU zU#Bgu@>j!834_O7KE}WWY~(6CXBL?PB4&)uTdK_UfK~VHaYk5`UWSFFs}CA7OSuty z9Q&5~o{jA2XuBSTM*?#z=vn^;$IU%2KzB*K;%b|HqzJ2eg(8N_*D$3&JRzhUv$9cM zw?H5!g0&E{Q+pZVOSolc3aKiW*O`$fmVMo?_Suz#O1wssH9uFDTp@KJAF>_%l$FK5 zR3ZS>5z_JtJ~uy6hc=;-w!K<`G~b5PUCCgD*fA5j)QHi(UgXQ()uqTe|<)gt9>W{ zh#*k>8GhF~MSpa^xI$C=}C~A9b`Dd z{(q^9@({-7iroXz8X|uI@@aDZaIE&X-`ra8f{Ov8EuCX1T*RjI8!h*eJ<7MpOfEHI z>^SD2l|N7t~9(hUkk~(ABW}HUfp~s&3))D3TdKyhD6E zK@CxN%@0ZwjaET1&B(#OFY>-2aWztrah(-^3D{?|NL_P34N9Z~+@zh!j4+y#c83?N zQ4#WTOHORZR^+nD>qDFpFC3AU3q8~_y-;$RKxDo7OcZJ};Bk56*8D3p&=f1fGRVhI zq|kM}1dm9{n-)WwkJ`?HVuVQ5l-P|zw<{-3BAmiu^ebmj97?#oC2`-)G+R+jtI(zx z4+gv=W84Ek#+E7o=#E5Ln1Yw{U$u!sJKbL1(~|Z>u)peH@!{){Z-ueJcJKbFCPXaG zZO>B*(JI^49$@Hbq*RI4x3q<`4Lt=oeD^>xck*NWrjSFdZ+8{4O+5CAg)l%8{8v4x zQ*ja{1hu^2fMbw(D5;a=@$TfFnEvxD$ZnG-eJLF|HX8^7SbkAfT+{nyG>IWz$80k~ zH~VUCW_onakMK8Gog7Vn3OTZry;fApQ%7m5E%U5YG*;5aX0xB(8xp@CbF}77_d>_w z&{fsf@Ii@Ca>a^Vkd2|JJV%|emoXDe6PeCh*rr@7hQ)s%v_MStO^d5R21LCV@YGcWII%3LcfO*g|K)hIqA zcUil()eT25@JQqqNpvF%^!X}G&2Qu-*?@uFq9l9)*igMfbMH_bc!6AC`-xjn#q^Vj zl730_jBRbd(#>#XLnw(XC($5|`I5LOpX^+4l!@EJRpC!;{;J6|d(T|A9iN4Shc-ky zv(}~q*BY>hiOkt=IyD*;X&9_Iw>{Yr)pJ!)+H=rn7>!6=OvE zET(J$%!MJeJY)RKiz}EduU@258P(kqAk;>9fqDpOnYMvA3V97Xp^nAF@rC@Zs;~&s|eN?8YGf=;^4FkI%oyRNdrsr9Y72+mDYqLRBcF?el+>f(}6O?#l&h9pY^}*MG zauua4EY*gXraRe^6ed5%v!T~O6!rShy&I5Qub@<{^O{ftIayAxTO!lN9}6nejr?2z zyq~KA-yB_F$WAkEEwzMFytrscitzJcR}46D(;5D;7vk9~RbNVMKK5!-tV5GhF6%B= z_OpTy8+SDJwK*EJ5@E`+YQbH=MtuafS8@@$%^x1BGX=e>!;Uh5KcTaKsAedhL}FTE z_(HBO(+Cf)YXCrK<+ORJ`=B zHG&DqC!T}?iBziuDwc03OIe`2<&yFhg7;(g*v<(%ybKpy590gsfN`~}D3*Z-AMKFw zl@5k**i-)$n!^&Zm6?YX&DvfA_SK-$ zO$AT8ONkB*0!6N6Z~1tV{Nq}Hd6YQzTYo|*LLWdwcxS1ovGZ}==zX7MomXb$?wq%h0xODu!vp0j-??1Qkrtj-tA5||9 zq02C-9PDFH*w_=_0QU+37 zx6#_V%}GT31efK$n^@h-i(qI2^X7~*`RrIOM|;M8oHN2&KSfq@6cGiPnI)!D{!-K{ z!`6i@WN(?s#Mk;XWwvXJk10QW4r+>2RgN&OK!&Q*-K{~ zPj-daI9xGlDazb31jC0fKT@9w$_O?(vZbm9J>EV|4hPLNS!`}YW0YtstCgzSlNj+_ zAr4FcX+0EL{s}ba(jYr!2lhL%OeLdkh zX#Y`&upVIW^Gn&@D1~ENsiX!@ZYOhKGj+{+cUt~HL|k1f`uz`jRke7WkzM(LSw`D- zTPcB#l82fW{(ZzNQc@3;&3pYbg&n4`@U1rrYE^15!4QDE6MG#^PpM^zMP^bM%_?&o z>Cwn_C{(&6^~%0m`GzP(|0R6h@`P@T(U_ml$|GY{RS{9(zcz}wZPXdy!3tul>- zS*;AmL=86u|ATF9{;#PLr9}CA#$s zQiCQSS4BF~p~si5!G=ml-@-c=X5S*J_uCpca<~&#VZob7wxBKa^`vd1bJ_b&GZAKV2ynE`d0EzXxuxysoW;6vxRrrHH~!()-ospG#J zNQ=txYwacD)piUJy~Eifec;xWu<;1#5}A<3%JEhb9&UkGHZ@_xT?{hSN{NC5_++CJ zFfYN=XiZhr{DS9-*@I=|-r$gvdroLW1A0o7$CMr%x8doxaMeSuFe>lwqW;`Dx|ZEXR?!LxAl0^(0yW(&bxJa+|H%p zn!IG?5Pkc8OW*WL2yW~Jw_=ODPhGy7I*xq-9&XRFFgXU8dz6o8W5&sD?eRg>N?Gbq1BqSU6#h#aVz*Eqjr&zCp; zDW#12<+`ZvXq%#ADQV*)kB<8jg#+168eZbNBagP%pceQuPv1wLRF;SQP(Op8SqHR2 zcD1?*^t@U%?g3Y)h2RmZ6&2drcDeONfTYfQOAcXgtr0-T)Nm@LsM=fyK$O1rL3mwe zq(y&Gdh3Qh6)WvyLiM1OqVb^g$7Kx}+irft&2qVEeSKQSDYn)3m;Ai5yxKS9+N@y6 z9B7oz4*IuSflqI-()WATN+jQKR^yy=itDK^*JYzcy65+bXu9)BOIYqtShbnP+{kv8 zsyd`>pV#af{J%zNjrTbsfWZk`$EU}5rVpQ71^e+S>~m42r6kuL!7=sdwrNUCP2;31 zc90gbe>NUjMc2FKmfZQ;S|z=H-Ak;6OF|lWBZ_U)&P7L7_NaQ!0dHsvDSqWG1%`*P zm!}kdS-IRIZ)gSxLZ`2+NMWo$Mt#H9258|da4-@0B6U2L9KF}wuniU zEwvf~yoDhLQ}-AhyK4cM(t+#-e7CG(fi1h&Z^Qes(21H$<;n^aoYw|6+Dgy-<`dOC zZ8LB_@25oeZO}J+$q24bs|$v&3<)tUQ8Lw$-we{G3<;^REzZM#z992Y7q9dDUcSh) z%#sh`Z@cRLRPJVu0qRrHjj+@+inK}huVIbN-_*6_2&&qMg&dlY)MK9V8Q1a#{{`YF z41m~KVUe(0F~9CM&*?{LY0|AL;Z>>zonY=AYUHyLpgW=ML|V3dd3oQ9yiax|1Xeo- z_?i8dQNPr9MyqJLuV#)C=xa>7B(P$)6`a!PYm~v?5fwYS0*tZGo;E--=ua5f2wknZ zW81&aff~5u*qjQ^@((wti7(fY?;Ls+NJJIGWj&-7R!at`RW}KHz|#q+f1t-4&L~Wz zJfqO3Q!ON?>gXvU56=W;cfki~25q94gRhxGT#t@Hz8!+L!9zZTc^6%soQ&n;8HzBc zgL8>^-Pp|W1EBqK`t4>3d9b!Ph%;Sihu);0^sD$|QLK%$(c8Kfc9YdY0MQbP_p7{G zux=~*w3Wg)KS!HVcT`x`&e_v9+>JmZLkClcVnSuI{H{Ds#p zF4vCT5W8t+oCtZ0t|F&4wPy$y)u6k`AEK1z0xq(Ig&T?Q60z3SI9q$DA)&{5xNs?( zw$kx7DN)%#+pfUWq}I4@=4b_7h*>&Z%C#Mb#PTEKCmn)2?Tdq`cMTV0|&j&|3o(($iWAB-yiZlnp2JXi0JS){LI$#^6_*Vh*PM zdcZPwsFfbRHNrd5joZz0N=FscUTLX=GEKoa@H>*fs=FNrNLHej>KLHQzwqmqrK*J< zZu{0o3Xbq-Ts4?u7TDYr-GrKQJ*96X;*S#Xbi*9#(3vFW`=q~aLRYhh@`eK3Fk-ud zAzcW@3viZVW;*Z?p^%vdYqpXJmZa>gW{*9_d85^lxfSdPUj#LN_6lMN)n=K%!pXyl zde91mHQOu^OB)q$sa7r-JvIhDBZ2at-$Fx95#fh3VJ=H`Ez{3Z5l09cm@TdHH6?ZF z9ozSJYBY7K_Q=PVH#2a&>i{fNd-dFRK)$e*xxKI_Aak_;H7klb?C@xjHx-FCGx4iZK%jtu~-s1nJ=L784b50^8wJERq z4;%ziLMd>gS^K0q z%=-U5>*V>Be2=xW?l!NQOOem}$%XcE1Ug1q-bx^&dq;;DL~@YPCjN_=asUtEH>UP^ zjh5UrHd9#8V1y`6b|S#TPGTHB>?~-A!PPOX#ofi%+e#hP1xD85d}25o*M*6VschJ_ zI9E11lg;tW>NoE0)E{TBMm#ISbVmAq>*~ATNpYya9(JpqABW z$>i8xI6s8yya9rvVa{}FV*+XgT;=77%Z+a1WhecQH-fvvv=xA_)p?t1+-f@*QW z+D(p3@1;w#ZXs`cChfyshJc5VzDt@uYmxzpP*P>1Yv+F$w#R_x<#6dv zTuv}_gKqeObri75Ta|sJd)|0TfDMgW77g~YKjQ@jnFf)4kHQ=J0^RYxT?||%8>)=c zPXWH@uO!#kyIyuv<)5yCLvZwAU4Ra-qg%FsXCRx)IR&Uh<*vWEyAOTMU}J1I0LqqN zaun+hbS=XeGM2&dX`$&QGVN!o_^78O(N*kP7ZXkdP z?WQR)=Y=^V7n$LfdpAKaL$IW^*z;B)C}gv+`djeZ9l2M@9eI!xbyZXn0DC}|2Fpwh zXXD8*9&jlpfKQEBAW04a-;$ndB~JU_?kOm5dja@$LY=IB#gCa4amRf@p_Yx(^mk7d z?E{ar?paqP1YEzzCyl6MVk-k53Kj9mR_E<&RGh>^dO1!KWneA9qy{bLN)Ia^KZElO z(yN!Kk6dcXL{*HhY@s0T=lm=ViV0)$!5jD}+zZZ`?m#)pdDhjpmwFZTbvuJIb`6=6KMW(6~+L z+H*eYCnSsjyFqWQVrunx&D7iiVKZ+@>{Qj15?$#%3?fdPvLkk)$0uGa#g>q z3leGpV3du<2FKQQnh_O=b%6*{nu7pGB0#a`Vh{zeR&-{zSt34lqE;nLBnu-71`zJB z)1>qi&v`+9YtPtOnXyW8{IBrk#& z3y(GDx^`DRA*5r`Q+Zpa3~v;aVk{ge9^n9cuKS3u%{IS@<}Go~G2I$A!P9_L=OhGq#^LHL_qvVVGB2M21p>z_?CNz@&*bXrxL5_S19J$nT(ocUt zuB2B}M9zDO@<5d2XfO{7@LiLj*Z>XZ@6P4-4h#TZ!M|k8&c@3^=0)?jQ|2w4rsqU~ zMoCb5%-coJx5Jf((eL%@+s3^`!g;DC5)!@~{UV1{?nEV)1#HXt;_FSmB4S?5ZJHg~T z?^G)N^`J1NL?9;O${p$rax6y+%;PFgHY)z07fLMr z10+Xi2Js<>GGhqw0`5iq{l#7$RTLNIXwt7w>7lc0R8IiHrvZ4PQxYn# z`#YOEThlqxj%c$CR=SalDuzSbaQ++Iw!Jr?#HzVF7<6Q{mQ|tF-F}%td^h`Tu#fbD zP7;s-b&HqzqScYxq7+W^Hz=|B5AarRyZv~+S{D{)j6$EK4)A10rD;hm==Fl+MR!&z z^Qk($iR#q6WV!zIh790fzC%p`(^M=A$&ka=v{y-$%TF;>?Gtq2>My7XCCXxl zS`(%m_>MVSH6PhU3q3CKC$3sxQ4aG*P1JR%%XEj@DOL~W&19E{ zlKW3`-QQl(IcgL0s8?TH^L7e5P?!tls1)RcR^0iP%1XIZu}?tFz1ZNK$Z{N~$7I_A zQ4g$9FWym8jGC@Xw1Bx-66eVT_%@!Y`kH#MBdNF|?r1 zfq~4E#cz7!{R|f-6JY;NXceO7O0LD9o6c>E5KrM-s0R-qmzY|rAGO~DP*W|cqQvvo z?%@Ou=Yj?dCu0HE70?vmwat(lm%azBrruY>j6-JOJHMwdXNL9C(Fn{gX1lCXUF?_X zPWKiSIC@-WYkr^RKNh7>KJIx|^`(!*&{pW?N8Qf&xWksuKbKKG|jxKc)lDRGEqmD24 z+-pHNC6!CQ)_v3|*mChp!D%-0-5^?Vj;8>^wD0rzuJ7YNMgISI`O38zfq?Xcf&U+X z_TNM@d8#KRP8)h0g&5R-A!PrdfAu^maocj!DE@H&FKqUM5rd_5c~W8lTC}E=4<#|S z=QOC;vNE7d?>`M8(UzE)717y#HKkvR@!JQM+D4@wom0@fzH~Ik3@F$#wUpE7P$!&j zxy=3a>N&Ar`k}`tHJ%COtBiEg{FYLe>pNUu{w>UX;3yLc>wNh$_EMYt4gI$O0Guqe z#1kGzGbtgdGbIro72v=DCZBOKmHO;PtFCoj!m1LHA+RhldgQsGP@?OH$;*nRvvEcR!aLUbf@rYUg4F^m3mdnDc5lD-J*z zUUk}oI{n74r*83$f9ThEIrlUvE9HaHzlLmPyfD{XoVc8Eyi_s(a5ZtJ)32`!B*Lso z{w>}u5f|QQ#`TOu)T(*c@6;iPb7q@=$R&_o!ThoUjbmeDLD;Bdfw0p$r_B$E(i9;n z(kN9{&J$gNSV?GuIvL{|G_+v_0+I1gG6pJFRq`VbblPHkLmpQU#=Cb>P^}VPzv`xidgu}mD znvfE-lPn03LS~z7CqyM8DcWI)UH%-*@(3Z7v$_XoChi<(t-Sz_dlWdz2j{U~M=G37 z&|Vty`yN2&$wU82lVGcKVo^{e$68kSyw-|mGt&GNs~C1g+i^FEJJ>Mr#1lNbL-d%V zdfQnJ;29T48QMhEK%Wt5%GT3I?WiZA8REr+V=4qFnkUsSk*bBho~65yRm7{Oe?HSS zK+ABz!`VQFC7oj)uF$J%epRV6`6@n>rPwyd0Q1rYfx~WC$p=H-EOgp zm&>6n!NBTnua&9knf!H(6431%u0gmxXs@3UT6vt>>}vgvFR3JGXUA=S^RE8FGT-)l z`E>(0`{*xnp1rTR9iUAu|C4PK8AA*GlF3EvhB-$B%z@TA%U~4wLLkN~2HjxG93g+@ zNn8>dV9o$T( zNKU$|lejC?zGj96SY>NO<%DDMj3pX>LEf@XAtYYB}!1GSA=7Q+kE!>Ma3 ztvSCR8m8Y#w)U-0Y#3)62mrb$lH9NkUB?hG?ja_2mVM;-`3R4! zn|U%u1r;swkqRG%3h{FY6fuCD=8P3*h(ST(D^?3|e?KatR2LZV3&%rOp=2DD*WUxY zh)Jk1XT&ABf$M9geH-9I_j}lj*MM*(Zs8S|j9**8Mx}q=YgL87=YVD(|d=bqcQ)&fpSIibV z?FA-p%MJ#k^e9u*gVFBf+10I9F!zj4hSdpjGAdP&v+uc-ud^p8bQzoB?0(D=W0ATs z={hNr7;?K2xGqiaIhIa9#6rs3p6TiL*xL8_!cp>YWWRRqlW~x&s%!CTzt`>&fI^R= zBJi-*w3UR48(qzPC$^Zj;TE;@G*6L!j7D5IHAE!R1>Z zA`D;-HSjD}Q6HVVFTp#q=cvtd(AYOJI0l(hc#ru@uYDq~M;*C!gj7iqQ7i96E0<%5 zeM&=Fnu~DEf2S+hHPQHLI(k3%kdfc12PhDEE$SA|cQgp?%O;6}yXpX@NX>5U_&SKa zt6h3IP+LQ|_z7eIq%Qn=U4dh2eMw%%X~YFqC+1@1OquuzLEU2Qb9t4|2f zWo3%bZz=?NaS2VEN9t`em*0Q+yO!->A?{pR(@di_ExLP;9(HTR??I|b)h2R(MK6G- zw*TS_1>{027MBGxpMV3{rGG0U3;!Pgx5ArRc=r1+jFyDU_V%%XfAGWeC(m9!@6EyoM-Q%}SiD}$1w0PZAcrS$l!*Mn`G4C_ z@~7|0*;r%`&ih9Xcv(zS`0>+&NmN{fSdh4mMNmYy;?+2h!iXmiemQy&q)8!?0zQBH zm$y$Z*k!?sGJk(CEsA-5etZnyo|fZYkj{>u{9|xB7+wy#PcH}klhfDT*ZqFCe_YIu z@6zn%I!^EM<8S#b|F^-((~ILV4}T}3m)}kfEeqq&#x%(f88j$JLlLC6%M$d1UX&hB zrdtY`WPCndw&6dD^hPA_%9E4RkcUsRFT>&B`thN4xraF9JTG3RVRRjd@EI>~G6pAu zVfSRv9ee>px;hmD(^Pa4a^psHOU*5in-XEZt97i)g5r6sdo2WNW zChc8lt8M6`3nNpZU-BeOZ&yq1biPf?Ea5S`PBZpA0SU?@s48bs!oEw3D4DRYMIv~d zPND!_dy?mA5OFC)oz6WIw%M>Vm$mco;X`(j6j>UUQhKe$ecyPngYZi)vM}KjSKV~B4*z){{L3vE@e8KV}%|IsPgG>}zByM5k;N@Z} z^cP_CrqP^@MR6xYvMi;?E(#W=B4{zaLEJ+pwHp5dH{H(H7iWHG4gcayHM>pWrnHKaP1WLY5{{ z13U@COyv2OX?oLrfqxTmTE7}(0@@U^@j|}&_VRi6`Lj2$RHGu23Sv3&x#$Yehid(% z+2ruPMQrGu(e~WmyBEMi+&H_+jc@%^7l_^4Y5u74akNUqU3-q&sWYJZ$;oqaV%7M)x+bc`O5LM zuYTP&1*hGUM}JQ4?|!`8)={{}N*J4MT-5iB^Sn9C?;hxZe&9H8#`V57a6f`qn89C$ z8cdsoDACG3n5L=p6Q8EDd5KQi5&KRmcyJ#3)FX2NzPc!kJNi7LV^6u^q zHRQaPlz9(KLoWxLz^rG=s7_kP@gHf)0*($W52j!a7=JHhXT%H~WTr+LqdzsIxe(b~ zUc6sxrk2>{d)7m5R8IFy{_)(gGNTi^>jE)*hWF`-0ZC7Mue}SDIoCB(mUjBT?XJS7kF>KKfX)M&wKZtw|@m@5JVqCqZ_w5JXsHNM7=)C*K`g7iB z(K)4c4u3=Blt#1GHEdhz_}>x;iVXRp4zym)r;dI4HIp&PsJz#fHSWK&z2PY@2Ugsjo__~R)n3F;ku-8e^jWW*49#_hx$^foUjKieZxnn=K zPenWZtd-kgulX3Dn&bV*rzzk3pN#*V0l_*fsosx zJdRl=aC_jGhkTBE8nCE&e#9`#bHu{tHlW%%Ev8WxcIP~U7&)$Y7`j~+B|%( zB9#fIG>aw?=EYQ{jOXl5#BuxLXzk`s`Oel-iR$Q&vpiaRLQ#PBDISWtlk4MB6n}EN zx||=eiT*h+KuScoWvR5*>qQru9m2Iz!CAnKdL_OSv~le1hh^{N8d&S#hxZ5ig*S8D zq;22gYi*gAWaWUO-TqM0-P#i`3CsaSbxP@eCh};KI0*8<%Qnq`qPCQ`9!9rp#`KN1)#vc_G!8}9V=D^c z?T7DUo)m9hzF@D*0<0a6Kj7wy+V($|`Xg^g1Lzly3;o^vcrJ^Z#l2}Ui+>NXnpp5G zVbk=k(Q1id3ZtTKe!I$nDC{xBVw=NBQL#GW10ix11&YeG7X^yCL>SYPESN?G#C~OF z-}Y0A`m~R=D5`8*BB9x*XKMP5>4Yy%;L)+;yq)@iY*Mr#F4+z^+>LHB-A{PTCJ@Fa zjE~b>!Nf;cE>V)prHHV)Zhws7DGQ~#uAqER=JWRD(K-NL0H3E6&G@zK;TXc~I|LJdH#W4!U@lX7g!*?2AImWVk`20}Hi>eG3htK+O?a3++ zQIv5)r#zd8dNSv87V|Oz5yd9u(-L8|cUzFIZRTu9QPv&yq-fN6#K3|o&|Vz zfVvI2)3}cy%`)7b&ws@~OOXUZMZ-{b0#D^vXBZxk*Ia8yDE2{iq#iBV5Bx2cznZ&& zt&Nh~^alDFfKQP?V`l>D2_Ynxc>(AMOdB|U4vqF=E{0Td0Z!jdL!{8=4IV+a((Hyw zmo5<%RujB9(5txauG6wPKFq|Y2XinLjz^wuCsKeRLorl=1xB?(j(>T@GL~a z!Hq+Ey`&mO6o2)LWAGHD0c@WdgFyb$)#mSzWnvDNL#Zo}n^^AJq)F36%J2==@~n)D zXdZ7WI(y|c@{(K_k@B*gZi-8>Kp&!SWtFnm-Zg(S-JQk(Ni`&@xC5PuLk_pj`i%*abVV?@!h)IhKr z+bsd%=+Tf65JGFujJRDd8QBpTuXw_)Uh)LwH@i|gogLgw zBbZ?2nB_}f8_}2uWMMD@D_zH$p}Hj`8;r(nl$JT0r;$^)ck*6aOQopWuRxQDj~oY7 zS$6GDEya698gM9dr`3xxxVmEX=qNY;{`py!pnqpW7o?_Sb4IFW)fM&FtIa^Esjj)s z)GRwvOtZ9{Ol6yv4bJ$I8L8%8%Z-+fOz=ES&N2Ck^Na(StqFTt1JJUqf>6UA|v7n$UA>ES)V9ZrY~4|O{#g(6LsgNW@EE3}qMF-+S` zNPoRDwGt2xNu0DBoVaiIkG^l&&hHV_ic# zSFueTA9=}tJfaEQIRzqM2BvA$#^`XXfd7C(0Nk@ zUSTqW`D2uX>D?7t5Gge?4yK`;;~S{Mb0&I|o{T%eHh!6YygFi6KZqRS$7fMKkNE;0 zd=I)WO++Ty-3e4&CWL`-j9(C7qDIIDsxYX|GG)cuV;|0V? zFiTgx>yOKQU^$NXYUNMWx&cO3A%CQfal2)?@w?%xt+YVr)3pTn(^1PxbS{5WQ8r$Y zJ>ExSRtM#HtqKQK;>Bh@qS(w$X={%UTVa)6%;p!g_)BF{RWdBAG93AaXMaWUY1-!J z3mU8tQH27$E6m6Q;KEOYg#PI~tV&wusakB>G$9Xlj2b$W{&pS6&UD-4mwy}@Ofi-n zc|r_k7c)e0$ZV7j6E?=|2wE9%7-ID?3QQ*C87*nD@(n0J&qzHN4$Y^SR!j}d1Nl`vt6-nE#^~B0Z>;F{ zExxv{KK8OT@R*`ow}tJpW9#nxM!t6hVY_S8{@BZ2!DH%PLAA-gns#aAX_RkRWt?Py zkA@^l+H`rrZ=?^XHTA)}2i1nay9b9?GO-pQ8lK}$dFAHW?t?nc<4XrDNdIJ~3{ZQq6g}MUu^*=*StjXosms8XF6Zd0F8xzp zd8i8dltaXvYdkdWFEx%ltHf5ji7HKj>b1-gjY38fJeRL2|9@Tv+H2dc2bg?0GA{`Q zLz96%GzRng_`Labd;Qx#p_rI{PaXZ1$uyAko;j;hM0KAJWS)4QL2R9ic!6k)>LXZQ zh$({q;bul&jw?Uh)LrPP9=^Pqi2CTbl|7g(UUz$cDF&zCTS4Mr1cpDCNfaQOybi&t z@Zk=nNeM{ZV1GH2I7`}Sz}(A7;;^SwK}A)zRyX|ZR=_G-9)LNT0rYLz5cp6@E;3V#g<&SVnsIlLvKZaGwy#H(!R z`dY{3fvX*b6%SOEsZ6b6Tm*Hegim|16k~;9gUt0ckde#4xl)@4DcD;aoH}W{8dfMQ z!7_0up-3o9sJGOncQYYlA8qtWbX138ccmOCh5b|wnJLydJJ})D=#wa{_MQNVGFo{8 z)g0bq|9{*2K+E4qJH2L{mDyVr9t{RC7-S`rwFL(8{rf-u&zi4!fX}WJd0-y%Kul!{ zdx@J;`Qo5f6cRt8Z5PzJZl{$-s8jN*D@f~Jsasc!c(XqWEUn2)%_c9c?MC%=#ce~O z^i!_X(~3r`O0`d8^+`n9j@$<_jC?gHo4wI*w14Y_@f z7WzP1Fl$lFvv{Eqaq~1+J3`Q$BZw?AnIRUEc;GTNUbcw(B(^Um`J`DTB>CDqV4IJV zHG0j*Ntp8SvL5>YyYGiR+$Yh8x0wyusr%AY!_hA2lD;2iaGyjCb|{w0XxL2TI}DAN z-GBN%iQU_gr|WBbp+%kH@=#ksQBQz&#C+S@enbri3_``e!MYTlLkK zwh->y2ZzRRX!If|vkV@CZq*rRf$($@s^1J9Q6`{@F(qIj7l`v_(2HzwsN)p@78A|l zhwCT?Wg)^3a#yVxGlCjdLApl1Wx38%mVb%bHIv8MT)i5Dskp_TadgzmRIO60OJgLo z%~0)5<#*~{s331;qi&p*i3Za_V`S6TcJyEzQ%sMcU$f8~d$|fCYqEuovE8IKwgPb{kSB{O@~f_y0OPZYkj_^E{Kg2#*+E3DM4RYh!W7Nbk@7Kg z=5nS&;sm@qwE-Gs3_U;09v}=twMQ}->ERk0R zz#L_h5*9BeniNFw)vNChne-1(5Pv62TClu+WU55)HJ@CmWmRo{G(2VSE0r3lwbO=( za|QBU`Ib~QAlC5qKg$S#Wr@%=>2-t$fR$1mvw}}Bg#wNa4{J1KU0(vuj)o;@d1;oD zQdO#Fcg1TEq{)!S&AJ={ArcAPq1avXXS!RY9ea00up0@xy;yS0Qt?}N z0oL_Ntm=+*PIG>X?kSQ@HX;nYwUjlSy4n%__VU$tOj+h5eft*=6@y=!Fog#>(BSo>o?VCU}xpTNsVB5O@kAk{%fv@`LDF zS$9dOTOkLf`V)K&d;>JzV%vFU?LtEfuWaFLxckz;blDs;j|ssK`(Lh{Oqh+JDCDZXR9HL}{bl z=rv4DFVKu~Hixy#x5bt1E%lQ`B2mEq6zA{t{cy+oB=WdCf$w64#piOQq#qV{pG4!9 zk(Q>SA?_#0qA_lrpw5F>9$5{=bg|^5sq@|f2q=;2d<|M$vP0xTs0Ko8fk(8r){m+p z@wib{y?gie`z)0im4A2d-m^DJn1XT+)2ffwy!8HVOzrlAPiZFuLzk-luvHOtsM3!X zBC(raOB%KANLkOyOkl1q%4cXyuX%u1<8TdMx%wO4bA>$YX6ituCd9`=n)TJBf}#Z{ zjpAWdfCXP1sf=ByHn|d+MO69CE8cX0pk|f!l}?b($I8dwr+@ORP&?EZDSrkNDTrZN zlA%}6|G`7d)fKPp+r90B>PH`vXu=)y(96?QqT=B2>bGD2?{B~UKlt|&e4mx%^{S(s z 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 T&}w91?`WzN;cz3Ua-shLAkDLQ diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 756a8d9a..caef055d 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,50 +1,50 @@ -Mar 10, 2024 4:35:57 AM reposense.system.LogsManager addFileHandler +Mar 10, 2024 2:37:05 PM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Mar 10, 2024 4:35:57 AM reposense.parser.CsvParser validateHeader +Mar 10, 2024 2:37:05 PM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, repo-config.csv, and recognized columns: Ignore Standalone Config, Repository's Location, Branch, Shallow Cloning, File formats, Ignore Glob List, Ignore Authors List, Find Previous Authors, Ignore Commits List -Mar 10, 2024 4:35:57 AM reposense.parser.RepoConfigCsvParser matchValueAndKeyword +Mar 10, 2024 2:37:05 PM reposense.parser.RepoConfigCsvParser matchValueAndKeyword WARNING: Ignoring unknown value 02a7620d1ed1d78c4ed314a67cf8c359a5a97dc5;ca7ce2d5c002a436dfccc9621a3de79fb140f5c5;92f90c348b0741617ace600a4e405bbe681dd795;d2fecfe583c1c351929ad4e6afc900bcc96f45d8;7e6624f484ea788645ed2d42d34fed57a06976a6;b524367f655bd758f95a7ac73e32c35b3d0219c5;66dcd0ed0a3f94a90b339936a8421aa03eb959e0;2c111e93c9140e523e532aba953f58457561867d;beae79deffcbbdef42f3222a0d937ff4f3961f40;f539c5095bde90a01fd591b0ad5c1d633f3c07b3;ce0abf71c5163b5c97539a960017c1cb7f524243;6376848908a5ab36696cc3b233ab1d4050a1a375;21de2ce55fcc9ffe1f188da7c67b05cbbcfef840;72cbb26bf7d664fdc845206ba97c62d5dc4b4c2b;a69eccecfb02e23360f2286bf626c5ddb08dc62d;360564cb5892ae1c758678718ae0b6ce27a0c8e3 in yes column. -Mar 10, 2024 4:35:57 AM reposense.parser.CsvParser validateHeader +Mar 10, 2024 2:37:05 PM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, author-config.csv, and recognized columns: Author's Emails, Repository's Location, Author's GitHub ID, Branch, Author's Display Name, Ignore Glob List, Author's Git Author Name -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias chen wenlong found. The alias will belong to the last author - c-wenlong -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias liu jiayao found. The alias will belong to the last author - ljy0422 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias liu jiayao found. The alias will belong to the last author - ljy0422 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias chen wenlong found. The alias will belong to the last author - c-wenlong -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 10, 2024 4:35:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 10, 2024 2:37:05 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 10, 2024 4:35:57 AM reposense.parser.CsvParser validateHeader +Mar 10, 2024 2:37:05 PM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, group-config.csv, and recognized columns: Globs, Repository's Location, Group Name -Mar 10, 2024 4:35:57 AM reposense.git.GitConfig getGlobalGitLfsConfig +Mar 10, 2024 2:37:06 PM reposense.git.GitConfig getGlobalGitLfsConfig WARNING: Could not get global git lfs config java.lang.RuntimeException: reposense.system.CommandRunnerProcessException: Error returned from command git config --global --list on path . : fatal: unable to read config file '/home/runner/.gitconfig': No such file or directory @@ -60,1663 +60,1663 @@ fatal: unable to read config file '/home/runner/.gitconfig': No such file or dir at reposense.system.CommandRunner.runCommand(CommandRunner.java:21) ... 3 more -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-2/tp.git... -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-3/tp.git... -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git to complete... -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-2/tp.git... +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git to complete... +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... -Mar 10, 2024 4:35:57 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:06 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:07 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git completed! -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:07 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-3/tp.git... -Mar 10, 2024 4:35:58 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:07 PM reposense.report.ReportGenerator analyzeRepos INFO: [1/92] Analyzing https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:07 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git to complete... -Mar 10, 2024 4:35:58 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:07 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:35:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 10, 2024 2:37:07 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 10, 2024 2:37:07 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! +Mar 10, 2024 2:37:08 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! +Mar 10, 2024 2:37:08 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-4/tp.git... -Mar 10, 2024 4:35:58 AM reposense.report.ReportGenerator analyzeRepos -INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:08 PM reposense.report.ReportGenerator analyzeRepos +INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 10, 2024 2:37:08 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git to complete... -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:08 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! -Mar 10, 2024 4:35:58 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:35:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 10, 2024 4:35:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:08 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-2/tp.git... -Mar 10, 2024 4:35:58 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:08 PM reposense.report.ReportGenerator analyzeRepos INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 10, 2024 4:35:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:08 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git to complete... -Mar 10, 2024 4:35:59 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! -Mar 10, 2024 4:35:59 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:08 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 10, 2024 2:37:08 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:35:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 10, 2024 4:35:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 10, 2024 4:35:59 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:08 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 10, 2024 2:37:08 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 10, 2024 2:37:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 10, 2024 2:37:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 10, 2024 2:37:08 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! +Mar 10, 2024 2:37:08 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! +Mar 10, 2024 2:37:09 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! +Mar 10, 2024 2:37:09 PM reposense.report.ReportGenerator analyzeRepos +INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 10, 2024 2:37:09 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... -Mar 10, 2024 4:35:59 AM reposense.report.ReportGenerator analyzeRepos -INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 10, 2024 4:35:59 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:09 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... -Mar 10, 2024 4:35:59 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! -Mar 10, 2024 4:35:59 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:35:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 10, 2024 4:35:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:09 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:09 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 10, 2024 2:37:09 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 10, 2024 4:35:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:09 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! -Mar 10, 2024 4:36:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:10 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! +Mar 10, 2024 2:37:10 PM reposense.report.ReportGenerator analyzeRepos +INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 10, 2024 2:37:10 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator analyzeRepos -INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:10 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git to complete... -Mar 10, 2024 4:36:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator analyzeRepos -INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator analyzeRepos -INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:10 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 10, 2024 4:36:00 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:10 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! +Mar 10, 2024 2:37:10 PM reposense.report.ReportGenerator analyzeRepos +INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 10, 2024 2:37:10 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... +Mar 10, 2024 2:37:10 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... +Mar 10, 2024 2:37:10 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 10, 2024 2:37:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 10, 2024 2:37:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 10, 2024 2:37:10 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! +Mar 10, 2024 2:37:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 10, 2024 2:37:10 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! +Mar 10, 2024 2:37:11 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! -Mar 10, 2024 4:36:01 AM reposense.report.ReportGenerator analyzeRepos -INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... -Mar 10, 2024 4:36:01 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... -Mar 10, 2024 4:36:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:11 PM reposense.report.ReportGenerator analyzeRepos +INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 10, 2024 2:37:11 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... +Mar 10, 2024 2:37:11 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... +Mar 10, 2024 2:37:11 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! -Mar 10, 2024 4:36:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! -Mar 10, 2024 4:36:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:11 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! +Mar 10, 2024 2:37:11 PM reposense.report.ReportGenerator analyzeRepos +INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 10, 2024 2:37:11 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... +Mar 10, 2024 2:37:11 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... +Mar 10, 2024 2:37:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 10, 2024 2:37:11 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 10, 2024 2:37:11 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 10, 2024 2:37:11 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! +Mar 10, 2024 2:37:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:11 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:11 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) completed! -Mar 10, 2024 4:36:01 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! -Mar 10, 2024 4:36:01 AM reposense.report.ReportGenerator analyzeRepos -INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 10, 2024 4:36:01 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:12 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! +Mar 10, 2024 2:37:12 PM reposense.report.ReportGenerator analyzeRepos +INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 10, 2024 2:37:12 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... -Mar 10, 2024 4:36:01 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:12 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... -Mar 10, 2024 4:36:02 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! -Mar 10, 2024 4:36:02 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator analyzeRepos -INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:12 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:12 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) completed! -Mar 10, 2024 4:36:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! -Mar 10, 2024 4:36:02 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! -Mar 10, 2024 4:36:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:12 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! +Mar 10, 2024 2:37:12 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... +Mar 10, 2024 2:37:12 PM reposense.report.ReportGenerator analyzeRepos +INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 10, 2024 2:37:12 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... +Mar 10, 2024 2:37:12 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 10, 2024 2:37:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 10, 2024 2:37:13 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! +Mar 10, 2024 2:37:13 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! +Mar 10, 2024 2:37:13 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-2/tp.git... -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:13 PM reposense.report.ReportGenerator analyzeRepos INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:13 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git to complete... -Mar 10, 2024 4:36:02 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! -Mar 10, 2024 4:36:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! -Mar 10, 2024 4:36:02 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:13 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 10, 2024 2:37:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 10, 2024 2:37:13 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! +Mar 10, 2024 2:37:14 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! +Mar 10, 2024 2:37:14 PM reposense.report.ReportGenerator analyzeRepos INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:14 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-1/tp.git... -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:14 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git to complete... -Mar 10, 2024 4:36:03 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:14 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:14 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git completed! -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... -Mar 10, 2024 4:36:03 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:14 PM reposense.report.ReportGenerator analyzeRepos INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:14 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... +Mar 10, 2024 2:37:14 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... -Mar 10, 2024 4:36:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 10, 2024 2:37:14 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! -Mar 10, 2024 4:36:03 AM reposense.report.ReportGenerator analyzeRepos -INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... -Mar 10, 2024 4:36:03 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator analyzeRepos +INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 10, 2024 2:37:15 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... -Mar 10, 2024 4:36:03 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 10, 2024 4:36:03 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! -Mar 10, 2024 4:36:03 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:15 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! -Mar 10, 2024 4:36:04 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git completed! -Mar 10, 2024 4:36:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:15 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! -Mar 10, 2024 4:36:04 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... -Mar 10, 2024 4:36:04 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git completed! +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator analyzeRepos INFO: [15/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git to complete... -Mar 10, 2024 4:36:04 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! -Mar 10, 2024 4:36:04 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator analyzeRepos INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-3/tp.git... -Mar 10, 2024 4:36:04 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:15 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... -Mar 10, 2024 4:36:04 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 10, 2024 4:36:04 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:15 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:15 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! +Mar 10, 2024 2:37:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! +Mar 10, 2024 2:37:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! +Mar 10, 2024 2:37:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! -Mar 10, 2024 4:36:05 AM reposense.report.ReportGenerator analyzeRepos -INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:16 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... -Mar 10, 2024 4:36:05 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! -Mar 10, 2024 4:36:05 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:16 PM reposense.report.ReportGenerator analyzeRepos +INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... -Mar 10, 2024 4:36:05 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:16 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 10, 2024 2:37:16 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! +Mar 10, 2024 2:37:16 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... -Mar 10, 2024 4:36:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! -Mar 10, 2024 4:36:05 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:16 PM reposense.report.ReportGenerator analyzeRepos INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... -Mar 10, 2024 4:36:05 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:05 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:16 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:05 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! -Mar 10, 2024 4:36:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 10, 2024 4:36:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! -Mar 10, 2024 4:36:06 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:17 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:17 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! +Mar 10, 2024 2:37:17 PM reposense.report.ReportGenerator analyzeRepos +INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 10, 2024 2:37:17 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-1/tp.git... -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator analyzeRepos -INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:17 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git to complete... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:17 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! +Mar 10, 2024 2:37:17 PM reposense.report.ReportGenerator analyzeRepos +INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 10, 2024 2:37:17 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator analyzeRepos -INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator analyzeRepos -INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:17 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:17 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... -Mar 10, 2024 4:36:06 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... -Mar 10, 2024 4:36:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:17 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... +Mar 10, 2024 2:37:17 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:17 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 10, 2024 2:37:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! -Mar 10, 2024 4:36:07 AM reposense.report.ReportGenerator analyzeRepos -INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:17 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! -Mar 10, 2024 4:36:07 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! -Mar 10, 2024 4:36:07 AM reposense.report.ReportGenerator analyzeRepos -INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... -Mar 10, 2024 4:36:07 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... -Mar 10, 2024 4:36:07 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! -Mar 10, 2024 4:36:07 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... -Mar 10, 2024 4:36:07 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... -Mar 10, 2024 4:36:07 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! -Mar 10, 2024 4:36:07 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 10, 2024 4:36:07 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator analyzeRepos -INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator analyzeRepos +INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator analyzeRepos +INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... +Mar 10, 2024 2:37:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:08 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! -Mar 10, 2024 4:36:08 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator analyzeRepos -INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... -Mar 10, 2024 4:36:08 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator analyzeRepos +INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! +Mar 10, 2024 2:37:18 PM reposense.report.ReportGenerator analyzeRepos +INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... +Mar 10, 2024 2:37:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... +Mar 10, 2024 2:37:19 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:08 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator analyzeRepos -INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! -Mar 10, 2024 4:36:08 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:08 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:19 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 10, 2024 2:37:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 10, 2024 2:37:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 10, 2024 4:36:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 10, 2024 2:37:19 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! +Mar 10, 2024 2:37:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:19 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! -Mar 10, 2024 4:36:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 10, 2024 2:37:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:19 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator analyzeRepos -INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:19 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! +Mar 10, 2024 2:37:19 PM reposense.report.ReportGenerator analyzeRepos +INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 10, 2024 2:37:19 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... +Mar 10, 2024 2:37:19 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... +Mar 10, 2024 2:37:19 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator analyzeRepos -INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator analyzeRepos +INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator analyzeRepos +INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:20 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... -Mar 10, 2024 4:36:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:20 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator analyzeRepos +INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... +Mar 10, 2024 2:37:20 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:20 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator analyzeRepos -INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:20 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! +Mar 10, 2024 2:37:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 10, 2024 2:37:20 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) completed! +Mar 10, 2024 2:37:21 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator analyzeRepos +INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git to complete... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator analyzeRepos -INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator analyzeRepos +INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... -Mar 10, 2024 4:36:09 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:21 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 10, 2024 4:36:09 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:21 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) completed! -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator analyzeRepos -INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-4/tp.git... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator analyzeRepos +INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git to complete... -Mar 10, 2024 4:36:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator analyzeRepos -INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! +Mar 10, 2024 2:37:21 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:21 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator analyzeRepos -INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... -Mar 10, 2024 4:36:10 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 10, 2024 4:36:10 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... -Mar 10, 2024 4:36:11 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:21 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator analyzeRepos +INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 10, 2024 2:37:21 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:22 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 10, 2024 4:36:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:22 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 10, 2024 2:37:22 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! +Mar 10, 2024 2:37:22 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 10, 2024 4:36:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:22 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 10, 2024 4:36:11 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:22 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! -Mar 10, 2024 4:36:11 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:22 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 10, 2024 2:37:22 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 10, 2024 2:37:22 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! +Mar 10, 2024 2:37:22 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 10, 2024 2:37:22 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 10, 2024 2:37:22 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator analyzeRepos +INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! -Mar 10, 2024 4:36:11 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator analyzeRepos INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 10, 2024 4:36:11 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... -Mar 10, 2024 4:36:11 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... -Mar 10, 2024 4:36:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 10, 2024 4:36:11 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 10, 2024 4:36:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 10, 2024 4:36:11 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! -Mar 10, 2024 4:36:12 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! -Mar 10, 2024 4:36:12 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator analyzeRepos +INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-2/tp.git... -Mar 10, 2024 4:36:12 AM reposense.report.ReportGenerator analyzeRepos -INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 10, 2024 4:36:12 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git to complete... -Mar 10, 2024 4:36:12 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 10, 2024 4:36:12 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! -Mar 10, 2024 4:36:12 AM reposense.report.ReportGenerator analyzeRepos -INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 10, 2024 4:36:12 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator analyzeRepos +INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... -Mar 10, 2024 4:36:12 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... -Mar 10, 2024 4:36:12 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! -Mar 10, 2024 4:36:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... -Mar 10, 2024 4:36:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... +Mar 10, 2024 2:37:23 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 10, 2024 2:37:24 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 10, 2024 2:37:24 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! -Mar 10, 2024 4:36:13 AM reposense.report.ReportGenerator analyzeRepos -INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:24 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:24 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! -Mar 10, 2024 4:36:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! -Mar 10, 2024 4:36:13 AM reposense.report.ReportGenerator analyzeRepos -INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... -Mar 10, 2024 4:36:13 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:13 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:24 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... -Mar 10, 2024 4:36:13 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:24 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:24 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! +Mar 10, 2024 2:37:24 PM reposense.report.ReportGenerator analyzeRepos +INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 10, 2024 2:37:24 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... +Mar 10, 2024 2:37:25 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... +Mar 10, 2024 2:37:25 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! +Mar 10, 2024 2:37:25 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... +Mar 10, 2024 2:37:25 PM reposense.report.ReportGenerator analyzeRepos +INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 10, 2024 2:37:25 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! -Mar 10, 2024 4:36:13 AM reposense.report.ReportGenerator analyzeRepos -INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 10, 2024 4:36:13 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:25 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... +Mar 10, 2024 2:37:25 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 10, 2024 2:37:25 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... -Mar 10, 2024 4:36:14 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:25 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... -Mar 10, 2024 4:36:14 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 10, 2024 4:36:14 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 10, 2024 4:36:14 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! -Mar 10, 2024 4:36:14 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:25 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 10, 2024 2:37:25 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... -Mar 10, 2024 4:36:14 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... -Mar 10, 2024 4:36:14 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 10, 2024 2:37:26 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 10, 2024 2:37:26 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! +Mar 10, 2024 2:37:26 PM reposense.report.ReportGenerator analyzeRepos +INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 10, 2024 2:37:26 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:26 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! -Mar 10, 2024 4:36:14 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... -Mar 10, 2024 4:36:14 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... -Mar 10, 2024 4:36:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 10, 2024 4:36:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 10, 2024 4:36:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 10, 2024 4:36:15 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:26 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! -Mar 10, 2024 4:36:15 AM reposense.report.ReportGenerator analyzeRepos -INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 10, 2024 4:36:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 10, 2024 4:36:15 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! -Mar 10, 2024 4:36:15 AM reposense.report.ReportGenerator analyzeRepos -INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 10, 2024 4:36:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.ReportGenerator analyzeRepos +INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git completed! -Mar 10, 2024 4:36:15 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 10, 2024 4:36:15 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... -Mar 10, 2024 4:36:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git to complete... -Mar 10, 2024 4:36:15 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 10, 2024 4:36:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! -Mar 10, 2024 4:36:15 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... -Mar 10, 2024 4:36:16 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:26 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... -Mar 10, 2024 4:36:16 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 10, 2024 4:36:16 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:27 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:27 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 10, 2024 2:37:27 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 10, 2024 2:37:27 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 10, 2024 2:37:27 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! +Mar 10, 2024 2:37:27 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! -Mar 10, 2024 4:36:16 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:27 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-2/tp.git... -Mar 10, 2024 4:36:16 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:27 PM reposense.report.ReportGenerator analyzeRepos +INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 10, 2024 2:37:27 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 10, 2024 2:37:27 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git to complete... -Mar 10, 2024 4:36:16 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 10, 2024 4:36:16 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! -Mar 10, 2024 4:36:16 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:27 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:27 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 10, 2024 2:37:28 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 10, 2024 2:37:28 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! +Mar 10, 2024 2:37:28 PM reposense.report.ReportGenerator analyzeRepos INFO: [42/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 10, 2024 4:36:16 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:28 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:28 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 10, 2024 4:36:16 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 10, 2024 4:36:16 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 10, 2024 4:36:16 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! -Mar 10, 2024 4:36:16 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:28 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! +Mar 10, 2024 2:37:28 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:28 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:28 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 10, 2024 2:37:28 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:28 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:28 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... -Mar 10, 2024 4:36:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:28 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 10, 2024 2:37:28 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! +Mar 10, 2024 2:37:28 PM reposense.report.ReportGenerator analyzeRepos +INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 10, 2024 2:37:28 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:28 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 10, 2024 2:37:29 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! +Mar 10, 2024 2:37:29 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:29 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 10, 2024 2:37:29 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:29 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator analyzeRepos -INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:29 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:29 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:29 PM reposense.report.ReportGenerator analyzeRepos INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:29 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! +Mar 10, 2024 2:37:29 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator analyzeRepos -INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 10, 2024 4:36:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:29 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 10, 2024 2:37:29 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... -Mar 10, 2024 4:36:17 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 10, 2024 4:36:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:29 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! +Mar 10, 2024 2:37:29 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:29 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 10, 2024 2:37:29 PM reposense.report.ReportGenerator analyzeRepos +INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 10, 2024 2:37:29 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:29 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 10, 2024 2:37:29 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! -Mar 10, 2024 4:36:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 10, 2024 4:36:18 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:30 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... -Mar 10, 2024 4:36:18 AM reposense.report.ReportGenerator analyzeRepos -INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:30 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 10, 2024 2:37:30 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! -Mar 10, 2024 4:36:18 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... +Mar 10, 2024 2:37:30 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 10, 2024 2:37:30 PM reposense.report.ReportGenerator analyzeRepos +INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 10, 2024 2:37:30 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... -Mar 10, 2024 4:36:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:30 PM reposense.report.ReportGenerator analyzeRepos +INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 10, 2024 2:37:30 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... -Mar 10, 2024 4:36:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:30 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:30 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 10, 2024 2:37:30 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator analyzeRepos -INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:30 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:30 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator analyzeRepos -INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator analyzeRepos +INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! -Mar 10, 2024 4:36:19 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:31 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... -Mar 10, 2024 4:36:19 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:31 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... -Mar 10, 2024 4:36:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:31 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:31 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator analyzeRepos +INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! -Mar 10, 2024 4:36:19 AM reposense.report.ReportGenerator analyzeRepos -INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 10, 2024 4:36:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator analyzeRepos +INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 10, 2024 2:37:31 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:31 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! -Mar 10, 2024 4:36:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! -Mar 10, 2024 4:36:20 AM reposense.report.ReportGenerator analyzeRepos -INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... -Mar 10, 2024 4:36:20 AM reposense.report.ReportGenerator analyzeRepos -INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... -Mar 10, 2024 4:36:20 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:32 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:32 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... -Mar 10, 2024 4:36:20 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... -Mar 10, 2024 4:36:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:32 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! -Mar 10, 2024 4:36:21 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... -Mar 10, 2024 4:36:21 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:32 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 10, 2024 2:37:32 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 10, 2024 2:37:32 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) completed! +Mar 10, 2024 2:37:32 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:32 PM reposense.report.ReportGenerator analyzeRepos +INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 10, 2024 2:37:32 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:33 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 10, 2024 2:37:33 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator analyzeRepos INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:33 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:33 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) completed! -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:33 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator analyzeRepos INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:33 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepos -INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator analyzeRepos -INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:33 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! +Mar 10, 2024 2:37:33 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 10, 2024 2:37:33 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:33 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator analyzeRepos +INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 10, 2024 2:37:33 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... +Mar 10, 2024 2:37:33 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... +Mar 10, 2024 2:37:33 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... +Mar 10, 2024 2:37:33 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... +Mar 10, 2024 2:37:33 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 10, 2024 2:37:33 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:33 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 10, 2024 4:36:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... -Mar 10, 2024 4:36:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepos +INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 10, 2024 2:37:34 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! +Mar 10, 2024 2:37:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:34 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepos INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:34 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 10, 2024 2:37:34 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... +Mar 10, 2024 2:37:34 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:34 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepos INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... -Mar 10, 2024 4:36:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:34 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... +Mar 10, 2024 2:37:34 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... +Mar 10, 2024 2:37:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepos -INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator analyzeRepos +INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 10, 2024 2:37:34 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! -Mar 10, 2024 4:36:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! -Mar 10, 2024 4:36:22 AM reposense.report.ReportGenerator analyzeRepos -INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... -Mar 10, 2024 4:36:22 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) completed! -Mar 10, 2024 4:36:23 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! -Mar 10, 2024 4:36:23 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator analyzeRepos -INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) completed! +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepos +INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepos +INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepos INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... -Mar 10, 2024 4:36:23 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! -Mar 10, 2024 4:36:23 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator analyzeRepos -INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:35 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:35 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:35 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! +Mar 10, 2024 2:37:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... +Mar 10, 2024 2:37:35 PM reposense.report.ReportGenerator analyzeRepos +INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 10, 2024 2:37:35 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... +Mar 10, 2024 2:37:36 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 10, 2024 4:36:23 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! -Mar 10, 2024 4:36:24 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 10, 2024 2:37:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 10, 2024 2:37:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:36 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! -Mar 10, 2024 4:36:24 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... -Mar 10, 2024 4:36:24 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:36 PM reposense.report.ReportGenerator analyzeRepos INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! -Mar 10, 2024 4:36:24 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... -Mar 10, 2024 4:36:24 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... -Mar 10, 2024 4:36:24 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... -Mar 10, 2024 4:36:24 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! -Mar 10, 2024 4:36:24 AM reposense.report.ReportGenerator analyzeRepos -INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 10, 2024 4:36:24 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:36 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! -Mar 10, 2024 4:36:25 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:36 PM reposense.report.ReportGenerator analyzeRepos +INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 10, 2024 2:37:36 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! -Mar 10, 2024 4:36:25 AM reposense.report.ReportGenerator analyzeRepos -INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:36 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:36 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 10, 2024 2:37:36 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... -Mar 10, 2024 4:36:25 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 10, 2024 4:36:25 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! -Mar 10, 2024 4:36:25 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:36 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! -Mar 10, 2024 4:36:25 AM reposense.report.ReportGenerator analyzeRepos -INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! -Mar 10, 2024 4:36:25 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:37 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git completed! -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:37 PM reposense.report.ReportGenerator analyzeRepos +INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-3/tp.git... -Mar 10, 2024 4:36:25 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 10, 2024 4:36:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git to complete... -Mar 10, 2024 4:36:26 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:37 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:37 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 10, 2024 2:37:37 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! +Mar 10, 2024 2:37:38 PM reposense.report.ReportGenerator analyzeRepos +INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 10, 2024 2:37:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 10, 2024 4:36:26 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:38 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! -Mar 10, 2024 4:36:26 AM reposense.report.ReportGenerator analyzeRepos -INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 10, 2024 4:36:26 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 10, 2024 4:36:26 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! -Mar 10, 2024 4:36:26 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:38 PM reposense.report.ReportGenerator analyzeRepos +INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 10, 2024 2:37:38 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! +Mar 10, 2024 2:37:38 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 10, 2024 2:37:38 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-2/tp.git... -Mar 10, 2024 4:36:26 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git to complete... -Mar 10, 2024 4:36:26 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! -Mar 10, 2024 4:36:26 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:38 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! +Mar 10, 2024 2:37:38 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 10, 2024 2:37:38 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... -Mar 10, 2024 4:36:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... -Mar 10, 2024 4:36:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator analyzeRepos -INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator analyzeRepos -INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! -Mar 10, 2024 4:36:27 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! -Mar 10, 2024 4:36:27 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-3/tp.git... -Mar 10, 2024 4:36:27 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... -Mar 10, 2024 4:36:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... -Mar 10, 2024 4:36:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! +Mar 10, 2024 2:37:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 10, 2024 2:37:39 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... -Mar 10, 2024 4:36:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator analyzeRepos -INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 10, 2024 4:36:27 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! -Mar 10, 2024 4:36:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! +Mar 10, 2024 2:37:39 PM reposense.report.ReportGenerator analyzeRepos +INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! -Mar 10, 2024 4:36:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:39 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... -Mar 10, 2024 4:36:28 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator analyzeRepos +INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator analyzeRepos +INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! +Mar 10, 2024 2:37:40 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator analyzeRepos INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:40 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... +Mar 10, 2024 2:37:40 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 10, 2024 2:37:40 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:41 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! -Mar 10, 2024 4:36:28 AM reposense.report.ReportGenerator analyzeRepos -INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! -Mar 10, 2024 4:36:28 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... -Mar 10, 2024 4:36:29 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... -Mar 10, 2024 4:36:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! -Mar 10, 2024 4:36:29 AM reposense.report.ReportGenerator analyzeRepos -INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! -Mar 10, 2024 4:36:29 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... -Mar 10, 2024 4:36:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... +Mar 10, 2024 2:37:41 PM reposense.report.ReportGenerator analyzeRepos +INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... -Mar 10, 2024 4:36:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! -Mar 10, 2024 4:36:29 AM reposense.report.ReportGenerator analyzeRepos -INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! +Mar 10, 2024 2:37:41 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 10, 2024 4:36:29 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! -Mar 10, 2024 4:36:30 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... -Mar 10, 2024 4:36:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 10, 2024 2:37:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... -Mar 10, 2024 4:36:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 10, 2024 4:36:30 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! -Mar 10, 2024 4:36:30 AM reposense.report.ReportGenerator analyzeRepos -INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 10, 2024 4:36:30 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:30 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 10, 2024 4:36:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 10, 2024 2:37:41 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! +Mar 10, 2024 2:37:41 PM reposense.report.ReportGenerator analyzeRepos +INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 10, 2024 2:37:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 10, 2024 2:37:41 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! +Mar 10, 2024 2:37:42 PM reposense.report.ReportGenerator analyzeRepos +INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 10, 2024 2:37:42 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 10, 2024 2:37:42 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 10, 2024 2:37:42 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git completed! -Mar 10, 2024 4:36:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 10, 2024 4:36:30 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:42 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... -Mar 10, 2024 4:36:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:42 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git to complete... -Mar 10, 2024 4:36:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 10, 2024 4:36:30 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:42 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! -Mar 10, 2024 4:36:30 AM reposense.report.ReportGenerator analyzeRepos -INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 10, 2024 4:36:31 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:42 PM reposense.report.ReportGenerator analyzeRepos +INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 10, 2024 2:37:42 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 10, 2024 2:37:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-3/tp.git... -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git to complete... -Mar 10, 2024 4:36:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! -Mar 10, 2024 4:36:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 10, 2024 4:36:31 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! +Mar 10, 2024 2:37:43 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 10, 2024 2:37:43 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... -Mar 10, 2024 4:36:31 AM reposense.report.ReportGenerator analyzeRepos -INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 10, 2024 4:36:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:43 PM reposense.report.ReportGenerator analyzeRepos +INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 10, 2024 2:37:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... -Mar 10, 2024 4:36:31 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 10, 2024 4:36:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:43 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... -Mar 10, 2024 4:36:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 10, 2024 4:36:32 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... -Mar 10, 2024 4:36:32 AM reposense.report.ReportGenerator analyzeRepos -INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git completed! -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... -Mar 10, 2024 4:36:32 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! -Mar 10, 2024 4:36:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... -Mar 10, 2024 4:36:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... +Mar 10, 2024 2:37:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 10, 2024 2:37:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... -Mar 10, 2024 4:36:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 10, 2024 4:36:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 10, 2024 4:36:33 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! -Mar 10, 2024 4:36:33 AM reposense.report.ReportGenerator analyzeRepos -INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 10, 2024 4:36:33 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 10, 2024 4:36:33 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! -Mar 10, 2024 4:36:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 10, 2024 4:36:33 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 10, 2024 2:37:45 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! +Mar 10, 2024 2:37:45 PM reposense.report.ReportGenerator analyzeRepos +INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 10, 2024 2:37:45 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 10, 2024 2:37:45 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! +Mar 10, 2024 2:37:45 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... -Mar 10, 2024 4:36:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:45 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... -Mar 10, 2024 4:36:33 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! -Mar 10, 2024 4:36:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.RepoCloner spawnCloneProcess +Mar 10, 2024 2:37:45 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! +Mar 10, 2024 2:37:46 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... -Mar 10, 2024 4:36:34 AM reposense.report.RepoCloner waitForCloneProcess +Mar 10, 2024 2:37:46 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... -Mar 10, 2024 4:36:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:46 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! +Mar 10, 2024 2:37:46 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! +Mar 10, 2024 2:37:46 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! +Mar 10, 2024 2:37:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 10, 2024 2:37:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! -Mar 10, 2024 4:36:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.ReportGenerator analyzeRepos -INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! -Mar 10, 2024 4:36:34 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! -Mar 10, 2024 4:36:34 AM reposense.report.ReportGenerator analyzeRepos -INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! -Mar 10, 2024 4:36:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 10, 2024 4:36:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos -INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos -INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 10, 2024 2:37:47 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos -INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos -INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepos INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos -INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos -INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. +Mar 10, 2024 2:37:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepos INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! -Mar 10, 2024 4:36:35 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 10, 2024 2:37:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepos INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 10, 2024 4:36:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepos -INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepos +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepos +INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepos INFO: [92/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) does not contain a standalone config file. -Mar 10, 2024 4:36:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 10, 2024 2:37:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) completed! -Mar 10, 2024 4:36:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... +Mar 10, 2024 2:37:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) completed! -Mar 10, 2024 4:36:36 AM reposense.report.ReportGenerator generateReposReport +Mar 10, 2024 2:37:49 PM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/tp-dashboard/tp-dashboard/reposense-report -Mar 10, 2024 4:36:36 AM reposense.RepoSense main -INFO: Elapsed processing time: 39.73 second(s) +Mar 10, 2024 2:37:50 PM reposense.RepoSense main +INFO: Elapsed processing time: 44.52 second(s) diff --git a/summary.json b/summary.json index dd6ac8c3..fa40d1c2 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Sun Mar 10 12:35:57 2024 UTC+08:00","reportGenerationTime":" 39.35 second(s)","zoneId":"UTC+08:00","reportTitle":"CS2103 tP Code Dashboard","repos":[{"location":{"location":"https://github.com/AY2324S2-CS2103-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103-T14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-1_tp_master"}],"errorSet":[],"sinceDate":"2024-02-23","untilDate":"2024-03-10","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}} +{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Sun Mar 10 22:37:06 2024 UTC+08:00","reportGenerationTime":" 44.13 second(s)","zoneId":"UTC+08:00","reportTitle":"CS2103 tP Code Dashboard","repos":[{"location":{"location":"https://github.com/AY2324S2-CS2103-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103-T14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-1_tp_master"}],"errorSet":[],"sinceDate":"2024-02-23","untilDate":"2024-03-10","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}}